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

标签 string bash

在 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带参数 astring和环境变量 sp设置为 this 的值,但使用引号可以防止这种情况。使用双引号而不是单引号的原因是允许变量插值。当字符串既没有变量也没有空格时,根本没有理由(除了样式)使用任何引号。

就个人而言,我觉得过度引用的风格有点过分。除非一个人在交互式提示上使用引号使用类似 ls "/p/a/t/h" 的命令,我认为没有必要在不需要时使用引号。为了保持一致性,那些提倡使用引号的人应该总是输入 "ls" "/p/a/t/h" ,而且我从来不知道有人会引用这样的命令。 OTOH,shell 引用规则可能有点神秘(请参阅上面的 #2!),如果有任何疑问,请使用引号。

关于string - 带引号和不带引号的 bash 字符串有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52938260/

相关文章:

swift - 在 Swift 中使用放置器本地化字符串

java - 将字符串转换为二进制 [Java]

linux - Bash 脚本无效空格符号

Bash 在参数 $@ 的字符串列表中删除重复项

linux - sed 的一些问题

linux - 递归地从目录中的文件中删除 '\r' 字符

c# - 按大写字母拆分字符串(不包括带连字符的单词)

string - 将字符视为变量

c++ - 在 C++ 中更改字符串或字符指针的某些字符

bash - n-1 个核心的一个衬垫?