HOWTO · Linux
如何在 Bash 中拼接字符串
了解如何在 Bash 中拼接字符串:将带引号的值并排写在一起、使用 += 追加文本、在循环中逐项构造字符串,或通过命令替换插入命令输出。本文提供清晰的语法示例,并说明如何控制分隔符以及何时应引用变量展开。
本页内容
在 Bash 中,可以把带引号的值并排写在一起以拼接字符串,也可以用 += 向现有变量追加内容。只有在赋值的值中明确写入空格时,结果才会包含空格。
方法 1:基本字符串拼接
要拼接两个值,可以将带引号的变量展开式放在一起。需要分隔符时,直接把它写在引号内:
string1="Hello"
string2="World"
result="$string1 $string2"
printf '%s\n' "$result"
这里,赋值语句在 $string1 和 $string2 之间包含一个空格,因此 result 的值是 Hello World。把值传给命令时,应像 printf '%s\n' "$result" 这样为展开结果加上引号;这样空格和通配符会保留在值中,不会触发分词或路径名展开。如果相邻文本可能被 Bash 当作变量名的一部分,可以用花括号明确变量名的边界,例如 "${string1}_suffix"。Bash 变量没有固定的字符串或整数类型,因此看起来像数字的值也能作为文本拼入字符串,例如先赋值 number=42,再写 label="ID: $number"。
方法 2:使用 += 运算符
使用 += 可以把右侧文本追加到变量当前的值:
greeting="Hello"
greeting+=" World"
printf '%s\n' "$greeting"
" World" 开头的空格会成为追加内容的一部分,因此 greeting 的值是 Hello World。这里的 += 会更新同一个变量,执行的是字符串追加,而不是算术加法。
方法 3:拼接多个字符串
多个带引号的变量展开式和字面文本可以并排组成一个值。请在需要的位置明确写出分隔符:
first="Bash"
second="is"
third="great!"
combined="$first $second $third"
printf '%s\n' "$combined"
三个展开值按顺序拼接,赋值语句中的两个空格就是分隔符。如果目标格式不需要空格,就省略它们;Bash 不会自动插入分隔符。
方法 4:在循环中拼接字符串
可以依次追加每个项目。下面的示例会在项目之间加入空格,因此不会在末尾留下多余空格:
result=""
separator=""
for word in "Learning" "Bash" "is" "fun"
do
result+="${separator}${word}"
separator=" "
done
printf '%s\n' "$result"
第一个项目前不加分隔符。每处理完一个项目,separator 就设为一个空格,于是后续项目之间都有空格,而最终值以 fun 结尾。可以把带引号的单词替换为自己的循环值;如果值可能包含空格或 shell 通配符,插入它们时也要引用展开结果。
方法 5:使用命令替换
命令替换的写法是 $(...):它会运行命令,并将命令的标准输出替换到外围赋值语句中:
name="John"
greeting="Hello, $(printf '%s' "$name")!"
printf '%s\n' "$greeting"
命令输出会插入 Hello, 和 ! 之间。命令替换会移除输出末尾的换行符;在命令中引用变量,并在把结果变量作为参数使用时为其加上引号。
总结
在 Bash 中拼接字符串,可以把带引号的值并排写在一起,明确加入分隔符,或用 += 向现有值追加内容。循环可以重复执行追加操作,$(...) 则可以插入命令输出。把展开结果作为参数传给命令时应加上引号,这样空格和通配符才会保留在值中。
常见问题
-
如何在 Bash 中拼接两个字符串?
可以将带引号的展开式并排赋值,例如combined="${first}${second}";也可以用combined+="$second"追加第二个值。如果结果需要空格,请在引号内明确写入空格。 -
可以在循环中拼接字符串吗?
可以。用+=将每个项目追加到结果变量;如果结果需要分隔符,就在项目之间明确添加。 -
Bash 中的命令替换是什么?
$(...)会运行命令,并把它的标准输出插入外围文本。输出末尾的换行符会被移除。 -
如何获取字符串的长度?
使用${#value}获取 Bash 变量值的长度。字符计数可能受当前 locale 影响;在Clocale 下,计数单位是字节。 -
如何拼接包含特殊字符的字符串?
可以。双引号会保留空格,并阻止变量值中的通配符展开;不过,输入字面字符时,shell 语法字符(例如$、反引号和引号)仍可能需要引用或转义。处理任意文本时,应选择能防止 shell 在赋值前解释其中字符的引用方式。