myFun1
和myFun2
下面的不会产生相同的输出。为什么?
#!/bin/bash
myFun1() {
local item
IFS=:
for item in "${@}"; do
echo "->${item}<-"
done
}
myFun2() {
local items="${@}";
local item
IFS=:
for item in "${items}"; do
echo "->${item}<-"
done
}
调用
myFun1 "a=b" "c='d 1'" "e"
产生
->a=b<-
->c='d 1'<-
->e<-
然而
myFun2 "a=b" "c='d 1'" "e"
产生
->a=b c='d 1' e<-
答案1
这种行为是由 POSIX 定义,Bash 和 Zsh 都努力遵守这一点。
@
扩展到位置参数,从 1 开始。当扩展发生在双引号内并且执行字段拆分(请参阅字段拆分)时,每个位置参数应扩展为单独的字段,...
然而,这种行为仅适用于$@
其自身。将其值分配给另一个变量会导致各个字段的含义丢失,然后将其视为单个字符串(就像您使用的一样$*
)。
我不确定 Zsh,但如果在 Bash 中您想保存$@
到另一个变量并能够利用字段分隔,则需要使用数组。
myFun2() {
local -a items=("${@}");
local item
IFS=:
for item in "${items[@]}"; do
echo "->${item}<-"
done
}
在 Bash 中,表单的数组扩展"${array[@]}"
与"$@"
.