哪种形式更适合在Bash中使用?

时间:2011-11-27 11:14:02

标签: bash quoting

我正在学习Bash,我看到了表格

  

C =示例

     回声“$ C”

给出相同的表格结果

  

C =“example”

     

echo $ C

我想知道是否更好地将“”放在变量的赋值中或者在$之后。或者如果它无动于衷。或者如果一个人认为比另一个更“漂亮”。

5 个答案:

答案 0 :(得分:5)

如果您确定变量的值是单个单词(无空格),则可以使用$varname${varname}。如果您无法保证这一点,那么您应该使用"$varname""${varname}"。请注意,bash在解释命令之前会进行分词,因此如果不引用表达式,实际上可能会出现语法错误,例如

C="white space"
if [ -z $C ]
then
  ...
fi

会导致语法错误:

-bash: [: white: binary operator expected

虽然这很好用:

C="white space"
if [ -z "$C" ]
then
  ...
fi

这是因为在第一个未加引用的情况下变量扩展之后bash看到了这个:

if [ -z white space ]
then
  ...
fi

并且-z运算符只需要一个,而不是两个参数。在第二个,引用案例bash看到这个:

if [ -z "white space" ]
then
  ...
fi

即。根据需要只需一个参数。另请注意,引号用于分配

C="white space"

因为如果你写了

,它也会产生错误
C=white space

因为这意味着:执行命令space,环境包含添加的变量C=white

因此,一般来说,您应引用这些表达式,以确保您的代码对不可预见的变量值更具鲁棒性。如果变量值来自输入,文件等,则尤其如此。通常可以放弃整数变量的引号,或者只想在echo $C中显示变量的值。

答案 1 :(得分:4)

字符串包含空格字符时很重要。如果没有引号,空格字符将被视为标记分隔符,而bash会尝试将替换字符串解释为表达式。

当您不打算将变量作为表达式的一部分进行求值时,始终将引号置于安全状态。

想象一下,您将输入从“示例”更改为“两个单词”,然后在执行脚本时可能会遇到奇怪的行为甚至语法错误,以防您忽略了上述内容。

换句话说,

C="abc def"
# the echo command receives one argument: "abc def"
echo "$C"
# echo receives two arguments: "abc" and "def"
echo $C
# bash tries to execute the program "abc" with a first argument "def"
$C
# bash tries to execute the program "abc def"
"$C"

答案 2 :(得分:2)

关于引号和分词的好文档:

“使用更多报价!”它们至关重要。另外,了解'"和`之间的区别。请参阅http://mywiki.wooledge.org/Quoteshttp://wiki.bash-hackers.org/syntax/words

来自IRC freenode #bash的greybot样本正在与世界交谈=)

答案 3 :(得分:1)

如果它是单字常量,则无关紧要。

但是,您应该阅读有关这两种引用的内容。试试this article和此documentation。还有SO question

答案 4 :(得分:0)

尝试使用空格的真实示例。对于字符串example,您根本不需要任何引用。因此,创建一个名为This is an example.txt的文件,然后重试。将echo替换为ls ...