bash関数に渡さずに$ @を引用する方法は?

bash関数に渡さずに$ @を引用する方法は?

$@私がやっているように渡さずに他の関数や他のスクリプトファイルで参照する方法を知りたいですgetopts。とても感謝しています!

#前の質問: bash getoptsはどのパラメータが呼び出されるのかをどうやって知ることができますか?

A() {
  B 
} 

B() {

  # how to reference the $@ of A here ?
  # which will be 1 2 3 4


}

A 1 2 3 4

ベストアンサー1

何らかの方法で位置パラメータを指定しないと、Aこれはできません。B以下を介して渡すことができます。

A() {
  B "$@"
}
B() {
  [ "$#" -eq 0 ] || printf '<%s>\n' "$@"
}

または配列に保存します。

A() {
  A_args=( "$@" )
  B
}
B() {
  [ "${#A_args[@]}" -eq 0 ] || printf '<%s>\n' "${A_args[@]}"
}

Bashは、ash / ksh88 / zsh(ksh93またはzshの変数ではない)などのprivateローカル変数の範囲を動的に指定するため、そのA_args変数localをに設定することも、A呼び出された関数で引き続き使用できますA

bashあなたにアクセス権を与える変わりやすい上位範囲であっても影の下unsetローカル変数は組み込み関数(場合によっては設定解除されず、代わりに親範囲の変数を表示します)として現在のバグを使用して現在の範囲で使用されますが、この方法で親範囲から取得することはできません。 //とは対照的に、bashでは位置パラメータを配列変数にマップできません。なぜなら、bash配列デザインは、配列が実際には配列ではなくzshKornシェルに基づいているからです。rcfish

一部のコードが関数の位置パラメータ、ローカルオプション、またはshift関数内でアクセスまたは変更できるようにするには、そのコードをその関数の範囲内で実行する必要があります。別の機能。setreturn

エイリアスを使用することも、使用しない場合もあります(Cプリプロセッサマクロに対応するシェルですが、引数を受け入れることはできません)eval

しかし、注意してください:

  • Bashシェルでは、POSIXモードではない場合、エイリアス拡張はデフォルトで無効になっているためshopt -s expand_aliases
  • エイリアスが存在する必要があります。今後関数のコードを読み、関数コード内で拡張します。

だからあなたはこれを行うことができます:

[ -z "$BASH_VERSION" ] || shopt -s expand_aliases # work around for bash
alias B='{
  [ "$#" -eq 0 || printf "<%s>\n" "$@"
  shift
}'
A() {
  echo "$#"
  B
  echo "$#"
}
A a b c

または:

B='
  [ "$#" -eq 0 || printf "<%s>\n" "$@"
  shift
'
A() {
  echo "$#"
  eval "$B"
  echo "$#"
}
A a b c

おすすめ記事