未能避免“[:参数太多”

问题描述 投票:0回答:2

我知道

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"
.

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

bash double-quotes
2个回答
1
投票

是因为你遇到了shell分词:你没给“引用”变量

学习如何在 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/031http://mywiki.wooledge.org/BashGuide/TestsAndConditionals。除非你是为 POSIX sh 写的,否则我推荐
[[


如果需要写

POSIX
代码,需要引号:

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

注意 single

=
运算符对于
POSIX
shell 的使用。


0
投票

为什么我的方法无效

那是因为

$MyVar
没有引号会被拆分成
"a
b"
(两个字符串)和
==
运算符仅适用于左侧的 one 参数和右侧的一个参数。

© www.soinside.com 2019 - 2024. All rights reserved.