我知道MyVar="a b" ; [ $MyVar = "a b" ]将发出错误信号,因为结果扩展为[ a b = "a b" ]。
MyVar="a b" ; [ $MyVar = "a b" ]
[ a b = "a b" ]
我试图避免这种情况:
$ MyVar="\"a b\"" $ [ $MyVar = "a b" ] -bash: [: too many arguments
为什么我失败了?* 不是扩展到[ "a b" = "a b" ]了吗?*
[ "a b" = "a b" ]
我知道有一个[[ ... ]]形式;我知道我可以写"$MyVar"。
[[ ... ]]
"$MyVar"
我在问为什么我的方法无效。
ua4mk5z41#
为什么我的方法无效。这是因为不带引号的$MyVar将被拆分为"a和b"(两个字符串),而==运算符只能在左手使用 * 一个 * 参数,在右侧使用一个参数。请注意,参数扩展是一次性的。它将变量$MyVar扩展为"a和b",然后不重新计算结果。展开发生的顺序在Shell expansion中列出:展开的顺序是:撑条膨胀;波浪号扩展、参数和变量扩展、算术扩展和命令替换(以从左到右的方式完成);字分裂;和文件名扩展。
$MyVar
"a
b"
==
unguejic2#
学习如何在shell中正确引用,这非常重要:“双引号”每个包含空格/元字符和 every 扩展的文字:"$var"、"$(command "$var")"、"${array[@]}"、"a & b"。使用'single quotes'作为代码或文字$'s: 'Costs $5 US',ssh host 'echo "$HOSTNAME"'。看http://mywiki.wooledge.org/Quoteshttp://mywiki.wooledge.org/Argumentshttp://wiki.bash-hackers.org/syntax/wordswhen-is-double-quoting-necessary最好在bash中使用此形式,无需引用:
"$var"
"$(command "$var")"
"${array[@]}"
"a & b"
'single quotes'
$'s: 'Costs $5 US'
ssh host 'echo "$HOSTNAME"'
bash
MyVar="a b" ; [[ $MyVar == "a b" ]]
[[是一个bash关键字,类似于[命令(但更强大)。参见http://mywiki.wooledge.org/BashFAQ/031和http://mywiki.wooledge.org/BashGuide/TestsAndConditionals。除非你是为POSIX sh编写的,否则我推荐[[如果你需要编写POSIX代码,你需要引号:
[[
[
POSIX
MyVar="a b" ; [ "$MyVar" = "a b" ] && echo ok
注意POSIX shell必须使用single=操作符。
=
2条答案
按热度按时间ua4mk5z41#
为什么我的方法无效。
这是因为不带引号的
$MyVar
将被拆分为"a
和b"
(两个字符串),而==
运算符只能在左手使用 * 一个 * 参数,在右侧使用一个参数。请注意,参数扩展是一次性的。它将变量
$MyVar
扩展为"a
和b"
,然后不重新计算结果。展开发生的顺序在Shell expansion中列出:展开的顺序是:撑条膨胀;波浪号扩展、参数和变量扩展、算术扩展和命令替换(以从左到右的方式完成);字分裂;和文件名扩展。
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
中使用此形式,无需引用:[[
是一个bash关键字,类似于[
命令(但更强大)。参见http://mywiki.wooledge.org/BashFAQ/031和http://mywiki.wooledge.org/BashGuide/TestsAndConditionals。除非你是为POSIX sh编写的,否则我推荐[[
如果你需要编写
POSIX
代码,你需要引号:注意
POSIX
shell必须使用single=
操作符。