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