echo 'Running' >> swtich
check=$(more switch)
您写入一个名为的文件swtich
,然后读取一个名为switch
. 该文件不存在,因此变量check
最终为空。
顺便说一句,为什么打电话more
?这仅对逐页查看文件有用。如果您正在管道输出,cat
则等效。如果more
没有控制终端,当您test.sh
在后台调用时会发生这种情况,会more
打印一个包含文件名的额外行,因此它的输出
所以你真的必须使用cat
而不是more
. (在 bash 中,您也可以编写check=$(<switch)
.)
[ $check = 'Running' ]
由于$check
为空,该命令[
接收三个参数=
:Running
和]
。这不是该[
命令的有效语法。
始终在变量替换和命令替换周围加上双引号:"$check"
, "$(somecommand)"
. 如果$
替换发生在引号之外,则结果将拆分为单独的单词(在您的情况下为 0 个单词,因为结果为空),并且这些单词被解释为文件 glob 模式。这几乎是不可取的,所以总是使用双引号,除非你真的有一个 glob 模式列表。
check=$(cat switch)
实际上是安全的,因为在作业中,右侧需要一个单词,因此不会发生分词。但是,为了清楚起见,您不妨写一下check="$(cat switch)"
。另外,如果你写的话,引号是必需的export check="$(cat switch)"
。
所以我们有:
#!/bin/bash
echo 'Running' >> switch
check=$(cat switch)
while [ "$check" = 'Running' ]
do
sleep 5s
check=$(cat switch)
done
在 bash 中(但不是在 sh 中),您可以编写[[ $check = Running ]]
而不是[ $check = Running ]
. 那是因为[[ … ]]
它是特殊的语法,不像[
是没有特殊解析的内置命令。但是,如果变量位于运算符的右侧,则需要双引号,因为inside=
的右侧是一个模式。与其学习这么复杂的规则,只要一直使用双引号就可以了。=
[[ … ]]