[: shell编程中的意外操作符

我的代码:

    #!/bin/sh
#filename:choose.sh
read choose
[ "$choose" == "y" -o "$choose" == "Y" ] && echo "Yes" && exit 0
[ "$choose" == "n" -o "$choose" == "N" ] && echo "No"  && exit 0
echo "Wrong Input" && exit 0

但是当我执行的时候

    sh ./choose.sh

终端提示我

   [: 4: n: :Unexpected operator
[: 5: n: :Unexpected operator

是否有任何错误在我的bash脚本? 谢谢!< / p >

246650 次浏览

您必须使用bash代替,或者使用标准sh重写脚本

sh -c 'test "$choose" = "y" -o "$choose" = "Y"'

你的bash脚本没有错误。但是你是用上海来执行它,它的语法没有那么广泛;)

因此,请运行bash ./choose.sh:)

要使用Bash执行它,请使用#!/bin/bash和chmod它是可执行的,然后使用

./choose.sh

POSIX 上海不理解字符串相等的==,因为这是一个bash-ism。请改用=

顺便说一句,其他人说上海不支持括号是错误的。

事实上,“[”方括号只是测试命令的内部shell别名。

所以你可以说:

test -f "/bin/bash" && echo "This system has a bash shell"

[ -f "/bin/bash" ] && echo "This system has a bash shell"

... 它们在sh或bash中是等价的。请注意,“[”命令上必须有一个结束的“]”括号,但除此之外,“[”与“test”相同。《男人测试》是一本值得阅读的好书。

可以使用case/esac代替if/else

case "$choose" in
[yY]) echo "Yes" && exit;;
[nN]) echo "No" && exit;;
* ) echo "wrong input" && exit;;
esac
不要使用任何保留关键字作为任何变量名的开头: eg HOSTNAME将失败,因为HOST {TYPE|NAME}被保留