作为命令使用,但不作为 shell 脚本使用。为什么?

作为命令使用,但不作为 shell 脚本使用。为什么?
$ 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

相关内容