在Bash中使用哪种形式更好?

3
我正在学习Bash,我发现以下形式:

C=例子

echo "$C"

和以下形式:

C="例子"

echo $C

会得到相同的结果。我想知道在变量赋值时将“”放在变量名称之后还是在$符号之后更好,或者是否没有区别,或者其中一个比另一个更美观。
5个回答

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

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

因此,通常应引用这些表达式,以确保您的代码更加健壮,可以抵御未预料到的变量值。特别是如果变量值来自输入、文件等,那么这一点尤其重要。对于整数变量或仅想显示变量值的情况(例如echo $C),通常可以安全地省略引号。


4

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

为了安全起见,请始终使用引号,当您不打算将变量作为表达式的一部分进行评估时。

想象一下,将输入从“example”更改为“two words”,那么在执行脚本时,如果您忽视了上述内容,可能会遇到奇怪的行为甚至语法错误。

换句话说,

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

我也认为最佳实践是在任何地方都使用引号!有时候可能不需要,但在我看来这样更易读。 - uzsolt

1

如果这是一个单词常量,那就无关紧要。

然而,你应该了解两种引用方式。试试这篇文章和这个文档。还有一个SO问题


是的,我看到了""和''之间的区别。 - Kyrol
引用的基础很简单,当一个值包含空格时,使用单引号或双引号。 - Kyrol
@Kyrol,单引号和双引号是不同的。只有双引号允许变量扩展和转义。 - Matthew Flaschen

0

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


是的。如果我使用我发布的第一种形式,就会出现错误。在第二种方式中,它似乎识别了空格。感谢实用的解释。 - Kyrol
我建议随处使用引号,特别是在使用变量时。 - Has QUIT--Anony-Mousse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接