我很困惑,为什么扩展一个分配了glob值的变量会在扩展时保留原义的空格。
# Test 1
Tuomas@DESKTOP-LI5P50P MINGW64 ~/shell
$ files=$(ls)
Tuomas@DESKTOP-LI5P50P MINGW64 ~/shell
$ args $files
12 args: <11914> <21771> <29904> <6496> <8807> <a> <b> <c> <d> <e> <test1/> <test2/>
# Test 2
Tuomas@DESKTOP-LI5P50P MINGW64 ~/shell
$ files=*
Tuomas@DESKTOP-LI5P50P MINGW64 ~/shell
$ args $files
11 args: <11914> <21771> <29904> <6496> <8807> <a> <b> <c> <d e> <test1> <test2>
我想在这两种分配中,变量最终都是一个字符串,随后的扩展将拆分为空白处的单词(不加引号)。显然,在全局测试中不是 情况。有什么机制在变量扩展期间保留字面上的空白?全局分配是否隐式地使其成为数组类型?据我所知,bash shell中只有字符串,数组和整数类型。我也知道,单词拆分总是在参数扩展之后进行。
答案 0 :(得分:2)
分词发生在参数扩展之后和文件名扩展之前。在扩展文件名之前,参数为*
,这就是通过单词拆分的方式(显然没有效果,因为它不包含空格)。
这就是为什么(几乎)始终使用*
而不是$(ls)
的原因。
答案 1 :(得分:1)
将文件分配给数组:
files=(*)
并使用数组:
echo "${files[@]}"