在 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
将解析为尝试调用命令 is
带参数 a
和 string
和环境变量 sp
设置为 this
的值,但使用引号可以防止这种情况。使用双引号而不是单引号的原因是允许变量插值。当字符串既没有变量也没有空格时,根本没有理由(除了样式)使用任何引号。就个人而言,我觉得过度引用的风格有点过分。除非一个人在交互式提示上使用引号使用类似
ls "/p/a/t/h"
的命令,我认为没有必要在不需要时使用引号。为了保持一致性,那些提倡使用引号的人应该总是输入 "ls" "/p/a/t/h"
,而且我从来不知道有人会引用这样的命令。 OTOH,shell 引用规则可能有点神秘(请参阅上面的 #2!),如果有任何疑问,请使用引号。
关于string - 带引号和不带引号的 bash 字符串有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52938260/