$@
私がやっているように渡さずに他の関数や他のスクリプトファイルで参照する方法を知りたいです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配列デザインは、配列が実際には配列ではなくzsh
Kornシェルに基づいているからです。rc
fish
一部のコードが関数の位置パラメータ、ローカルオプション、またはshift
関数内でアクセスまたは変更できるようにするには、そのコードをその関数の範囲内で実行する必要があります。別の機能。set
return
エイリアスを使用することも、使用しない場合もあります(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