#!/bin/bash
statefile=$HOME/.script.state
if [ -f "$statefile" ]; then
. "$statefile"
fi
case $state in
on) state=off ;;
*) state=on
esac
printf 'Current state is "%s"\n' "$state"
declare -p state >"$statefile"
测试:
$ bash script.sh
Current state is "on"
$ bash script.sh
Current state is "off"
$ bash script.sh
Current state is "on"
$ bash script.sh
Current state is "off"
#!/bin/bash
statefile=$HOME/.script.state
if [ -f "$statefile" ]; then
read state <"$statefile"
fi
case $state in
on) state=off ;;
*) state=on
esac
printf 'Current state is "%s"\n' "$state"
printf '%s\n' "$state" >"$statefile"
(
# our persistent file to save state into
file=./state
# array of two states, "off" is the first so that it will be 0, and "on" will be 1
states=(off on)
# import what's been saved in our state file, if present
[ -f "$file" ] && source "$file"
# within the arithmetic expansion syntax,
# we compute new state as the logical negation (the `!` operator) of the current state
state=$(( !(state) ))
printf 'state=%d\n' $state > "$file" # save new state to persistent file
# print current state from the array using the numeric state as index
printf 'currently %s\n' "${states[state]}"
)
在严格的 POSIX shell 中,它有点复杂,因为我们需要解决缺少数组的问题:
(
file=./state
# here we use a simple string instead of an array
states='off on'
[ -f "$file" ] && . "$file" # the `source` command POSIXly is just `.`
state=$(( !(state) ))
printf 'state=%d\n' $state > "$file"
# here we use the `cut` tool to select the piece of string based on numeric state
echo -n 'currently '; printf '%s\n' "$states" | cut -d ' ' -f $((state+1))
)
这样做意味着您必须保存激活的当前状态。
最简单的方法是为其中一种状态(可能是“开启”或“激活”状态)创建一个文件,并在进入另一种状态(“关闭”或“停用”)时删除该文件.
创建一个空文件是用 完成的
touch filename
,并且该文件是否存在的测试是用 完成的if [ -e filename ]; then ...; fi
。用 . 删除文件rm filename
。下面为您提供了通过将变量的值保存到文件中来在该状态下存储一些信息的选项。在这种情况下,状态由每次运行脚本时更改的持久文件携带(而不仅仅是每次调用脚本时创建或删除的文件)。
假设您正在使用
bash
:测试:
该脚本在每次运行结束时通过in将变量保存
state
到,并通过在开始时获取该文件从那里读取它(如果文件存在)。$HOME/.script.state
declare -p state
bash
这个文件最终看起来像
这是
declare -p state
if的输出$state
是 stringoff
。,
/bin/sh
上面的脚本可以写成...只需将状态的读取和写入替换为
read
andprintf
,这只会将状态字符串本身保存在状态文件中。如果您希望在每次运行时自动反转状态,您还可以利用“逻辑否定”数字运算,这对于反转值很有用。也就是说,0的逻辑否定是1,反之亦然。
POSIX shell 能够通过算术扩展来执行最常见的数字和按位运算,而Bash 也不短,它还提供了可以用 0 或 1(以及更多)等整数索引的数组。
在实践中:
在严格的 POSIX shell 中,它有点复杂,因为我们需要解决缺少数组的问题: