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

时间:2010-08-05 01:03:55

标签: linux bash 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脚本中有错误吗? 谢谢!

7 个答案:

答案 0 :(得分:278)

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

所以,改为运行bash ./choose.sh:)

答案 1 :(得分:254)

POSIX sh 无法理解==字符串相等性,因为它是 bash -ism。请改用=

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

答案 2 :(得分:5)

你必须使用bash代替或使用标准sh

重写你的脚本
sh -c 'test "$choose" = "y" -o "$choose" = "Y"'

答案 3 :(得分:5)

您可以使用case / esac而不是if / else

case "$choose" in
  [yY]) echo "Yes" && exit;;
  [nN]) echo "No" && exit;;
  * ) echo "wrong input" && exit;;
esac

答案 4 :(得分:4)

要使用Bash执行它,请使用#!/ bin / bash并将其命名为chmod,然后使用

./choose.sh

答案 5 :(得分:3)

实际上“[”方形开括号只是测试命令的内部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”相同。 “男人测试”是一件好事。

答案 6 :(得分:-4)

不要使用任何保留关键字作为任何变量名称的开头: 例如,HOSTNAME将失败,因为HOST {TYPE | NAME}被保留