我知道
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"
.
我在问为什么我的方法无效.
学习如何在 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
什么时候需要双引号
最好在
bash
中使用这种形式,无需引用:
MyVar="a b" ; [[ $MyVar == "a b" ]]
[[
是一个 bash 关键字,类似于(但比)[
命令更强大。见http://mywiki.wooledge.org/BashFAQ/031和http://mywiki.wooledge.org/BashGuide/TestsAndConditionals。除非你是为 POSIX sh 写的,否则我推荐 [[
如果需要写
POSIX
代码,需要引号:
MyVar="a b" ; [ "$MyVar" = "a b" ] && echo ok
注意 single
=
运算符对于 POSIX
shell 的使用。
为什么我的方法无效
那是因为
$MyVar
没有引号会被拆分成
"a
和 b"
(两个字符串)和 ==
运算符仅适用于左侧的 one 参数和右侧的一个参数。