Bash

理解 bash 或 zsh 中的 $@

  • August 18, 2021

myFun1myFun2以下不產生相同的輸出。為什麼?

#!/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[@]}"的數組擴展與"$@".

引用自:https://unix.stackexchange.com/questions/665229