您始终可以使用来显示变量引用的效果printf
。
分词完成于var1
:
$ var1="hello world"
$ printf '[%s]\n' $var1
[hello]
[world]
var1
引用,所以没有分词:
$ printf '[%s]\n' "$var1"
[hello world]
var1
内部单词拆分$()
,等效于echo "hello" "world"
:
$ var2=$(echo $var1)
$ printf '[%s]\n' "$var2"
[hello world]
没有单词分裂var1
,不引用没问题$()
:
$ var2=$(echo "$var1")
$ printf '[%s]\n' "$var2"
[hello world]
单词var1
再次分裂:
$ var2="$(echo $var1)"
$ printf '[%s]\n' "$var2"
[hello world]
引用两者,这是最简单的确定方法。
$ var2="$(echo "$var1")"
$ printf '[%s]\n' "$var2"
[hello world]
通配问题
不引用变量也可能导致其内容的全局扩展:
$ mkdir test; cd test; touch file1 file2
$ var="*"
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
请注意,这仅在变量展开后发生。赋值期间不必引用全局名称:
$ var=*
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
使用set -f
禁用此行为:
$ set -f
$ var=*
$ printf '[%s]\n' $var
[*]
并set +f
重新启用它:
$ set +f
$ printf '[%s]\n' $var
[file1]
[file2]