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

String 带引号的bash字符串和不带引号的bash字符串有什么区别,string,bash,String,Bash,在Bash脚本中用引号括住字符串内容是否重要? 考虑以下两个变量: str1=hei str2="Hi" 在bash中,上面哪种定义字符串文字的方法是首选的?为什么?这一点都不重要。纯粹出于文体上的原因,许多人会说使用引号是首选。bash中引号的唯一用途是控制单词分割和变量插值。(还有特殊角色……可能是一个相当长的列表)。由于等式的右侧没有变量和特殊字符,因此不需要引号 考虑以下几点: sp='this is a string with spaces' #1 sp=this' is a s

在Bash脚本中用引号括住字符串内容是否重要? 考虑以下两个变量:

str1=hei
str2="Hi"

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

这一点都不重要。纯粹出于文体上的原因,许多人会说使用引号是首选。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
将解析为试图调用带有参数
a
string
的命令
is
,并且环境变量
sp
设置为
this
的值,但使用引号可以防止这种情况发生。使用双引号而不是单引号的原因是允许变量插值。当字符串既没有变量也没有空格时,就没有理由(除了样式)使用任何引号


就我个人而言,我觉得过度引用的风格有点过分。除非有人在交互式提示中使用引号,比如
ls”/p/a/t/h“
,否则我认为没有理由在不需要引号时使用引号。为了保持一致性,那些提倡使用引号的人应该总是键入
“ls”“/p/a/t/h”
,我从来没有见过有人引用这样的命令。OTOH,shell引用规则可能有点晦涩难懂(请参见上文第2条!),如果有任何疑问,请使用引号。

两者都可以很好地工作,但引用字符串是最佳做法。Bash以各种方式处理空格-一旦字符串中有空格,跳过引号将导致中断…请参阅:and.Comprehensive!谢谢