引用vs不引用变量赋值的RHS上的变量

Joh*_*ohn 13 syntax bash quoting

在shell脚本中,将这两个变量分配给另一个变量时,这两者之间有什么区别:

a=$b
Run Code Online (Sandbox Code Playgroud)

a="$b"
Run Code Online (Sandbox Code Playgroud)

什么时候应该使用另一个?

n.r*_*.r. 6

我认为这里没有什么大不同.是的,建议在引用该变量时将变量括在双引号中.但是,$x在您的问题中似乎没有引用此处.

y=$x它本身不会影响如何处理空格.只有在$y实际使用时,引用才是重要的.例如:

$ x=" a    b "
$ y=$x
$ echo $y
a b
$ echo "$y"
 a    b
Run Code Online (Sandbox Code Playgroud)


Eta*_*ner 6

当用作语句本身时,没有(好的)理由对变量赋值的RHS进行双重引用.

赋值语句的RHS不受分词(或括号扩展)等的影响,因此无需正确分配引号.所有其他扩展(据我所知)确实发生在RHS上,但也出现在双引号中,因此引用没有任何意义.

话虽如此,有理由引用RHS.即如何在Bash命令替换中解决错误"bash:!d':event not found"(具体请参阅我的回答和rici的回答).


Cha*_*ffy 6

来自POSIX shell 语法规范的第 2.9.1 节

在分配值之前,每个变量分配都应针对波浪号扩展、参数扩展、命令替换、算术扩展和引号删除进行扩展

字符串拆分和通配(双引号抑制的步骤)不在此列表中。

因此,所述报价是所有简单的赋值语句(未在这里讲的那些与参数实现多余declareexport或类似的命令),除了那些(1)单引号,不双引号,字符串所需的行为; 或 (2) 值中的空格或其他内容将被解析为句法而不是文字。


(请注意,关于如何解析命令的决定——因此,无论是赋值、简单命令、复合命令还是其他东西——发生参数扩展之前;因此,var=$1被确定为赋值之前的赋值的价值$1被考虑过!如果这是不真实的,这样数据可能会默默地变成语法,那么在 bash 中编写处理不受信任数据的安全代码将更加困难 - 如果不是不可能的话)。


dog*_*ane 1

高级 Bash 脚本指南:第 5 章:引用

引用变量时,通常建议将其名称用双引号引起来。这可以防止重新解释带引号的字符串中的所有特殊字符。使用双引号来防止分词。用双引号括起来的参数将自身呈现为单个单词,即使它包含空格分隔符也是如此。

  • 一般来说,这是一个很好的建议,但在OP提到的具体情况下,引用没有任何意义。 (3认同)