Linux [:shell编程中的意外运算符
我的代码:Linux [:shell编程中的意外运算符,linux,bash,shell,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 Inpu
#!/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重写脚本
sh -c 'test "$choose" = "y" -o "$choose" = "Y"'
您的bash脚本中没有错误。但是您正在使用语法不太广泛的sh执行它;)
因此,请运行
bash./choose.sh
:)在bash脚本中没有错误。但是您正在使用语法不太广泛的sh执行它;)
因此,运行
bash./choose.sh
而不是:)要使用bash执行它,请使用#!/bin/bash并将其chmod为可执行,然后使用
./choose.sh
要使用Bash执行它,请使用#!/bin/Bash并将其chmod为可执行,然后使用
./choose.sh
POSIX sh不理解字符串相等的==
,因为这是一个bash ism。请改用=
其他人说括号不受sh支持是错误的,顺便说一句。POSIX sh不理解字符串相等,因为这是一个基本原则。请改用=
其他人说sh不支持方括号是错误的,顺便说一句。事实上,“[”方括号只是test命令的内部shell别名
所以你可以说:
test -f "/bin/bash" && echo "This system has a bash shell"
或
…它们在sh或bash中都是等效的。请注意,在“[”命令上有一个结束“]”括号的要求,但除此之外“[”与“test”相同。“man test”是一个很好的读法。事实上,“[”方括号只是test命令的内部shell别名
所以你可以说:
test -f "/bin/bash" && echo "This system has a bash shell"
或
…它们在sh或bash中都是等效的。请注意,在“[”命令上有一个结束“]”括号的要求,但除此之外“[”与“test”相同。“man test”是一个很好的读法。您可以使用case/esac而不是if/else
case "$choose" in
[yY]) echo "Yes" && exit;;
[nN]) echo "No" && exit;;
* ) echo "wrong input" && exit;;
esac
您可以使用case/esac而不是if/else
case "$choose" in
[yY]) echo "Yes" && exit;;
[nN]) echo "No" && exit;;
* ) echo "wrong input" && exit;;
esac
不要使用任何保留关键字作为任何变量名的开头:
例如主机名将失败,因为主机{TYPE | NAME}是保留的请勿使用任何保留关键字作为任何变量名的开头:
例如主机名将失败,因为主机{TYPE | NAME}是保留的当我在Linux和cygwin中执行相同的代码时,我没有收到任何错误。cygwin很可能将
sh
别名为bash
。一些发行版不再提供真正的sh
。尽管有些人会争辩(我倾向于同意)如果要编写一个可移植的脚本,请使用sh
而不是bash
。我的问题是我需要source foobar.sh
而不是/foobar.sh
两个错误:1.对/bin/sh2使用“=”而不是“=”。不处理空字符串。请${choose}BLAH==yBLAH来解决这个问题。所以从技术上讲,这也不是一个重复的问题。@personal_cloud,请不要推荐${choose}BLAH
方法——最好只引用“$choose”
;自1970年代以来就不需要固定的前缀/后缀(只要当前POSIX测试标准中标记为废弃的功能,如-a
或-o
,都是可以避免的)。当我在Linux和cygwin中执行相同的代码时,我没有收到任何错误。cygwin很可能将sh
别名为bash
。有些发行版不再提供真正的sh
。尽管有些人会争论(我倾向于同意)如果要编写一个可移植的脚本,请使用sh
而不是bash
。我的问题是我需要source foobar.sh
而不是/foobar.sh
两个错误:1.对/bin/sh2使用“=”而不是“=”。不处理空字符串。请${choose}BLAH==yBLAH来解决这个问题。所以从技术上讲,这也不是一个重复的问题。@personal_cloud,请不要推荐${choose}BLAH
方法——最好只引用“$choose”
;自1970年代以来就不需要固定的前缀/后缀(只要避免当前POSIX测试标准中标记为过时的特性,如-a
或-o
),我认为使用“[]”而不是“test”更方便。似乎“bash./choose.sh”可以解决问题。@kit无论哪种方式,sh都比较少portable@kit.yang括号如何更方便?由于人们没有意识到[是测试的同义词,以及括号周围省略空格所造成的持续错误所造成的历史混乱难以弥补保存的单个字符。(“如果[$x=5]”vs“if test$x=5”;13个字符vs 14个字符)。我认为使用“[]”而不是“test”更方便。似乎“bash./choose.sh”可以解决这个问题。@kit无论哪种方式,sh都比较少portable@kit.yang括号怎么更方便呢?人们没有意识到这一点而造成的历史混乱[是test的同义词,括号中省略的空格导致的持续错误几乎无法补偿保存的单个字符。(“if[$x=5]”vs“if test$x=5”;13个字符vs 14个字符).bash
语法是sh
语法的超集-系统上的/bin/sh
可执行文件可能只提供标准的sh
功能,其中[]
-不包括样式测试。是的。它们是完全不同的shell。尽管bash基于sh,并且在很大程度上与sh向后兼容,并且它们实际上可能是系统上的同一个程序,但根据您使用的名称,它们的行为仍会有所不同。您可以通过更改f第一行到#!/bin/bash
并使文件可执行,然后运行/choose.sh
。这个答案部分错误。完全正确的答案是现在的顶部-