bash 手册说:
关于:$*
当扩展发生在双引号内时,它扩展为单个单词,每个参数的值由
IFS
特殊变量的第一个字符分隔。也就是说,"$*"
相当于"$1c$2c..."
,其中是变量c
值的第一个字符。IFS
关于:$@
当扩展出现在双引号内时,每个参数都扩展为一个单独的单词。也就是说,
"$@"
相当于"$1" "$2" ...
.
IFS
如果变量值的第一个字符实际上是一个空格,我似乎无法想出这两个特殊参数会产生不同行为的示例。任何人都可以为我提供一个IFS
他们会产生不同行为的例子(同样,不改变)吗?
我自己的测试仍然让我有些困惑,如下所示:
#!/usr/bin/env bash
# File: test.sh
# set foo and bar in the global environment to $@ and $*
test_expansion () {
foo="$@"
bar="$*"
}
现在测试:
. test.sh
test_expansion a b c d
# foo is $@
# bar is $*
for e in "$foo"; do
echo "$e"
done
# a b c d
for e in "$bar"; do
echo "$e"
done
# a b c d
当您在命令行上传递的参数中包含 IFS 字符(例如,带有空格的参数)时,就会出现差异。要查看差异,请查看此脚本:
现在,看看传入带空格的参数时的区别。
更新 啊,将命令行中传入的内容分配给变量带来了它自己的小怪癖。:)
请记住,在命令行中传递的所有内容都是一个数组。因此,将数组分配给一个字符串会给您带来与对数组签名不同的东西。而且,根据您使用的是星号还是星号,处理数组的方式会有所不同。这是我的脚本的更新版本。
这是输出:
如您所见,存在不同的行为。
尝试这个:
输出:
"$*"
是单个词,同时"$@"
将所有参数扩展为单个词。此外,"$@"
即使参数包含 IFS 的第一个字符,也能正常工作。结果:
其次是
这表明在生成单引号字符串的同时生成单独引用元素
"$@"
的列表。"$*"
使用
bash
,这也可以通过一个带有多个命令行参数的简短 shell 脚本来说明:运行它:
这也表明 using
"$*"
将使用中的值$IFS
(仅第一个字符)来分隔扩展产生的字符串中的元素。