我的代码:

    #!/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脚本有错误吗? 谢谢!


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

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

bash脚本中没有错误。但是你正在用sh执行它,它的语法没有那么广泛;)

所以,运行bash ./ choice .sh:)


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

./choose.sh

POSIX sh不理解==表示字符串相等,因为这是一个bash-ism。用=代替。

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


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

所以你可以说:

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

or

[ -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}是保留的