3

我正在研究 Bash,我看到了表格

C=示例

回声“$C”

给出相同的结果

C =“示例”

回声 $C

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

4

5 回答 5

5

如果您确定变量的值是一个单词(没有空格),那么可以使用$varnameor ${varname}。如果你不能保证这一点,那么你应该使用"$varname"or "${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.

于 2011-11-27T11:26:40.423 回答
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"
于 2011-11-27T11:18:13.347 回答
2

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

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

来自 IRC freenode #bash 的 graybot 样本正在与世界对话 =)

于 2011-11-27T11:32:22.600 回答
1

如果它是一个单词常量,则无关紧要。

但是,您应该阅读这两种引用。试试这篇文章和这个文档。还有一个SO question

于 2011-11-27T11:17:46.677 回答
0

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

于 2011-11-27T11:18:17.950 回答