Bashまたはzshで$ @を理解する

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<-

ベストアンサー1

この行動はPOSIXで定義、BashとZshの両方がこれに準拠するよう努めています。

@
1から始まる位置パラメータに展開されます。二重引用符内で拡張が発生してフィールド分割が行われる場合(フィールド分割を参照)、各位置引数は別々のフィールドに拡張する必要があります。

ただし、この動作は$@自分にのみ適用されます。その値を別の変数に割り当てると、個々のフィールドの意味が失われ、単一の文字列(たとえば、使用した文字列$*)として扱われます。

Zshについてはわかりませんが、Bashの$@別の変数に保存してフィールドの分離を利用するには配列を使用する必要があります。

myFun2() {
  local -a items=("${@}");
  local item
  IFS=:
  for item in "${items[@]}"; do
    echo "->${item}<-"
  done
}

Bashでフォームの配列拡張"${array[@]}""$@"

おすすめ記事