我有以下 bash 脚本:
while [ $loop == "true" ]
do
//do stuff
done
但它说 [ 有错误。
此外,当将 stop 参数传递给脚本时,它将作为守护进程运行...循环应该会结束。我猜将 $loop 设置为 false 将自动结束循环。
答案1
最好的输入方式是:
while [ "$loop" = "true" ]
请阅读以下 URL 中的“制定测试命令”部分:
http://wiki.bash-hackers.org/syntax/quoting
答案2
M. Vazquez-Abrams 说得对。这与引号无关,引号使事情已经字符串转换为字符串,或者一些错误的想法,认为=
inbash
的内置[
命令不是字符串比较。(大家读读《Bash 用户手册》第 6.4 节吧!)这与字段拆分将单词转换为字段后空字段会发生什么有关。
如果 shell 变量loop
为空或为 null,则$loop
扩展为空字段。字段拆分后,空字段将被丢弃。请注意,字段拆分和空字段检查先于引号删除。因此"$loop"
扩展到字段""
,即不是为空,因此不会被删除。删除引号后,它将成为一个空字段,并成为命令的一个空参数。
该[
命令要求其=
操作符有两个操作数,fore 和 aft。其他任何操作数都是语法错误。由于删除了一个空字段,因此单词序列
[ $loop = true ]扩展为四字段
[
=
true
]
当[
命令需要五从语法上来说是正确的:
[
=
true
]
当然,空字符串不等于四个字符的字符串true
,并且命令的退出状态非零。
再次强调,所有这些都在 Bash 用户手册的 §3.5 和 §3.5.7 中。手册是你的朋友。