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=的右侧是一个模式。与其学习这么复杂的规则,只要一直使用双引号就可以了。=[[ … ]]