Shell中使用$string与"$string"设置参数为何存在差异?
对比
$string与"$string"的差异原因 测试案例
字符串相等性判断
string="xx yy zz" if [[ $string == "$string" ]]; then echo "Strings are equal." else echo "Strings are not equal." fi
运行结果:Strings are equal.
设置位置参数的差异
无引号使用$string
set -- $string echo $#
运行结果:3
使用
$string设置参数时得到3个参数。
带引号使用"$string"
set -- "$string" echo $#
运行结果:1
使用
"$string"设置参数时得到1个参数。
差异核心原因
这是Shell的**分词(Word Splitting)**机制导致的不同表现:
在
[[ ]]条件判断中[[ ]]是Bash专门设计的扩展条件结构,它内部对变量引用做了特殊处理——就算不用双引号包裹$string,也不会触发分词和路径扩展。$string会被直接当作完整的字符串值处理,所以和带引号的"$string"内容完全一致,判断结果自然相等。在普通命令参数位置(比如
set --之后)
- 直接写
$string时,Shell先展开变量值为xx yy zz,然后按照默认的IFS(内部字段分隔符,包含空格、制表符、换行符)拆分字符串,把它分成xx、yy、zz三个独立参数传给set,所以位置参数总数$#显示为3。 - 用双引号包裹
"$string"时,Shell会把变量的整个值当作单个完整参数传递,不会触发分词和扩展,set只收到一个参数,因此$#显示为1。
说白了,双引号的核心作用就是保护字符串不被Shell的拆分机制打散,当你需要把带空格的字符串当作单个参数使用时,必须加双引号;而[[ ]]作为特殊的判断结构,内部的变量引用默认就不会被拆分,所以有无引号结果一致。
内容的提问来源于stack exchange,提问作者showkey
相关产品推荐
相关产品推荐

