Bash
理解 bash 或 zsh 中的 $@
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<-
此行為由 POSIX 定義,Bash 和 Zsh 都努力遵守。
@
擴展到位置參數,從一個開始。當擴展發生在雙引號內時,並且在執行欄位拆分(請參閱欄位拆分)時,每個位置參數都應擴展為一個單獨的欄位,…
但是,此行為僅適用於
$@
自身。將其值分配給另一個變數會導致各個欄位的含義失去,然後將其視為單個字元串(就像您使用 一樣$*
)。我不確定 Zsh,但是如果在 Bash 中你想保存
$@
到另一個變數並能夠利用欄位分隔,你需要使用一個數組。myFun2() { local -a items=("${@}"); local item IFS=: for item in "${items[@]}"; do echo "->${item}<-" done }
在 Bash 中,表單
"${array[@]}"
的數組擴展與"$@"
.