shell 未能避免“[:太多的争论”

lkaoscv7  于 2023-05-18  发布在  Shell
关注(0)|答案(2)|浏览(197)

我知道MyVar="a b" ; [ $MyVar = "a b" ]将发出错误信号,因为结果扩展为[ a b = "a b" ]

我试图避免这种情况:

$ MyVar="\"a b\""
$ [ $MyVar = "a b" ]
-bash: [: too many arguments

为什么我失败了?* 不是扩展到[ "a b" = "a b" ]了吗?*

我知道有一个[[ ... ]]形式;我知道我可以写"$MyVar"

我在问为什么我的方法无效。

ua4mk5z4

ua4mk5z41#

为什么我的方法无效。
这是因为不带引号的$MyVar将被拆分为"ab"(两个字符串),而==运算符只能在左手使用 * 一个 * 参数,在右侧使用一个参数。
请注意,参数扩展是一次性的。它将变量$MyVar扩展为"ab",然后不重新计算结果。展开发生的顺序在Shell expansion中列出:
展开的顺序是:撑条膨胀;波浪号扩展、参数和变量扩展、算术扩展和命令替换(以从左到右的方式完成);字分裂;和文件名扩展。

unguejic

unguejic2#

因为遇到了shell word splitting:你错过了“引号”这个变量。

学习如何在shell中正确引用,这非常重要:
“双引号”每个包含空格/元字符和 every 扩展的文字:"$var""$(command "$var")""${array[@]}""a & b"。使用'single quotes'作为代码或文字$'s: 'Costs $5 US'ssh host 'echo "$HOSTNAME"'。看
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words
when-is-double-quoting-necessary
最好在bash中使用此形式,无需引用:

MyVar="a b" ; [[ $MyVar == "a b" ]]

[[是一个bash关键字,类似于[命令(但更强大)。参见http://mywiki.wooledge.org/BashFAQ/031http://mywiki.wooledge.org/BashGuide/TestsAndConditionals。除非你是为POSIX sh编写的,否则我推荐[[
如果你需要编写POSIX代码,你需要引号:

MyVar="a b" ; [ "$MyVar" = "a b" ] && echo ok

注意POSIX shell必须使用single=操作符。

相关问题