bash字符串带引号和不带引号有什么区别

时间:2018-10-22 21:52:54

标签: string bash

在Bash脚本中将字符串内容包含在引号中是否重要? 请考虑以下两个变量:

str1=hei
str2="Hi"

在bash中,上述哪种定义字符串文字的方式是首选,为什么?

1 个答案:

答案 0 :(得分:2)

没关系。纯粹出于风格原因,许多人会说首选使用引号。 bash中引号的唯一用途是控制单词拆分和变量插值。 (以及特殊字符。。。。可能是一长串)。由于方程的右侧没有变量且没有特殊字符,因此不需要引号。

请考虑以下内容:

sp='this is a string with spaces'   #1
sp=this' is a st'rin"g wit"h\ spaces  #2 same as #1
v=$sp     #3
v="$sp"   #4  equivalent to #3
v='$sp'   #5  assign literal string $sp

2和3在样式上很恐怖,但完全有效。由于在变量分配中不会发生单词拆分,因此#3和#4是等效的。带空格的字符串中双引号的目的是防止单词拆分(也可以使用反斜杠实现)。也就是说,sp=this is a string会被解析为尝试调用参数为isa并将环境变量string设置为以下值的命令sp的尝试。 this,但使用引号可以防止这种情况。使用双引号而不是单引号的原因是允许变量插值。当字符串既没有变量也没有空格时,根本没有理由(除了样式)根本不使用任何引号。

我个人认为,过度引用的样式有点过分。除非有人在带有ls "/p/a/t/h"之类的命令的交互式提示上使用引号,否则我认为没有必要在不需要引号时使用引号。为了保持一致,那些提倡使用引号的人们应该始终键入"ls" "/p/a/t/h",而我从未知道有人引用过这样的命令。 OTOH,shell引用规则可能有点不可思议(请参阅上面的#2!),如果有任何疑问,请使用引号。