Bash,将glob分配给变量

时间:2018-08-15 07:28:56

标签: bash shell scripting glob

我很困惑,为什么扩展一个分配了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中只有字符串,数组和整数类型。我也知道,单词拆分总是在参数扩展之后进行。

2 个答案:

答案 0 :(得分:2)

分词发生在参数扩展之后和文件名扩展之前。在扩展文件名之前,参数为*,这就是通过单词拆分的方式(显然没有效果,因为它不包含空格)。

这就是为什么(几乎)始终使用*而不是$(ls)的原因。

答案 1 :(得分:1)

将文件分配给数组:

files=(*)

并使用数组:

echo "${files[@]}"