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[@]}"
は"$@"
。