Joh*_*ohn 13 syntax bash quoting
在shell脚本中,将这两个变量分配给另一个变量时,这两者之间有什么区别:
a=$b
Run Code Online (Sandbox Code Playgroud)
和
a="$b"
Run Code Online (Sandbox Code Playgroud)
什么时候应该使用另一个?
我认为这里没有什么大不同.是的,建议在引用该变量时将变量括在双引号中.但是,$x在您的问题中似乎没有引用此处.
y=$x它本身不会影响如何处理空格.只有在$y实际使用时,引用才是重要的.例如:
$ x=" a b "
$ y=$x
$ echo $y
a b
$ echo "$y"
a b
Run Code Online (Sandbox Code Playgroud)
当用作语句本身时,没有(好的)理由对变量赋值的RHS进行双重引用.
赋值语句的RHS不受分词(或括号扩展)等的影响,因此无需正确分配引号.所有其他扩展(据我所知)确实发生在RHS上,但也出现在双引号中,因此引用没有任何意义.
话虽如此,有理由不引用RHS.即如何在Bash命令替换中解决错误"bash:!d':event not found"(具体请参阅我的回答和rici的回答).
来自POSIX shell 语法规范的第 2.9.1 节:
在分配值之前,每个变量分配都应针对波浪号扩展、参数扩展、命令替换、算术扩展和引号删除进行扩展。
字符串拆分和通配(双引号抑制的步骤)不在此列表中。
因此,所述报价是所有简单的赋值语句(未在这里讲的那些与参数实现多余declare,export或类似的命令),除了那些(1)单引号,不双引号,字符串所需的行为; 或 (2) 值中的空格或其他内容将被解析为句法而不是文字。
(请注意,关于如何解析命令的决定——因此,无论是赋值、简单命令、复合命令还是其他东西——发生在参数扩展之前;因此,var=$1被确定为赋值之前的赋值的价值$1被考虑过!如果这是不真实的,这样数据可能会默默地变成语法,那么在 bash 中编写处理不受信任数据的安全代码将更加困难 - 如果不是不可能的话)。
引用变量时,通常建议将其名称用双引号引起来。这可以防止重新解释带引号的字符串中的所有特殊字符。使用双引号来防止分词。用双引号括起来的参数将自身呈现为单个单词,即使它包含空格分隔符也是如此。