$ grep "apple" fruits.txt
apple
$ if [ $? == 0 ] ; then echo "A"; else echo "B"; fi
A
Run Code Online (Sandbox Code Playgroud)
当我执行上述命令时,它工作正常,但是当我将这些命令作为 shell 脚本运行时,它会抛出错误并打印 B。为什么会这样?
$ sh temp.sh
apple
temp.sh: 3: [: 0: unexpected operator
B
Run Code Online (Sandbox Code Playgroud)
问题是您使用的==是相等运算符(bash 支持),但随后运行的脚本sh不支持它。解决方法是更换:
if [ $? == 0 ] ; then echo "A"; else echo "B"; fi
Run Code Online (Sandbox Code Playgroud)
和:
if [ $? = 0 ] ; then echo "A"; else echo "B"; fi
Run Code Online (Sandbox Code Playgroud)
这将在bash和 plain下都有效sh。
虽然在这种特殊情况下可能没有区别,但它=是一个字符串比较。为了测试数字相等,应该使用-eq:
if [ $? -eq 0 ] ; then echo "A"; else echo "B"; fi
Run Code Online (Sandbox Code Playgroud)
==考虑这个脚本文件:
$ cat script.sh
grep "apple" fruits.txt
if [ $? == 0 ] ; then echo "A"; else echo "B"; fi
Run Code Online (Sandbox Code Playgroud)
它在 bash 下运行:
$ bash script.sh
apple
A
Run Code Online (Sandbox Code Playgroud)
它在 dash 下失败(dash 是类似 debian 的系统上的默认 sh):
$ dash script.sh
apple
script.sh: 2: [: 0: unexpected operator
B
Run Code Online (Sandbox Code Playgroud)
除了行号,您可以看到此错误消息与您所看到的相符。
无需$?直接访问。代码可以简化为:
$ if grep "apple" fruits.txt; then echo "A"; else echo "B"; fi
apple
A
Run Code Online (Sandbox Code Playgroud)
或者,使用逻辑与, &&, 和逻辑或, ||, 运算符:
grep "apple" fruits.txt && echo A || echo B
Run Code Online (Sandbox Code Playgroud)
上述工作是因为echo A,如果执行,将始终返回成功。