[:shell编程中的意外运算符[重复]

eit6fx6z  于 2023-04-12  发布在  Shell
关注(0)|答案(7)|浏览(171)

此问题已在此处有答案

Unexpected operator error [duplicate](4个答案)
7年前关闭。
我的代码:

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

snvhrwxg

snvhrwxg1#

您的bash脚本没有错误,但您使用**sh**执行它,它的语法不太复杂
因此,您需要运行bash ./choose.sh,或者将脚本转换为仅使用符合POSIX的sh命令,例如字符串之间的=而不是==

zqry0prt

zqry0prt2#

POSIX sh 不理解==的字符串相等性,因为这是一种 bash-ism。请使用=
其他人说括号不支持 sh 是错误的,顺便说一句。

mcvgt66p

mcvgt66p3#

要使用Bash执行它,使用#!/bin/bash并chmod它使其可执行,然后使用

./choose.sh
sc4hvdpw

sc4hvdpw4#

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

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

xoefb8l85#

你必须使用bash或者用标准sh重写脚本

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

vptzau2j6#

实际上,方括号“[”只是test命令的内部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”相同。“man test”是一个好东西。

aelbi1ox

aelbi1ox7#

不要使用任何保留关键字作为任何变量名的开头:例如,主机名将作为主机{TYPE}失败|NAME}是保留的

相关问题