非常に大きな配列$large_list
、配列を引数としてとる関数を書く方法はありますか?例えば:
echo_idx_array () {
arr="$1"
idx="$2"
echo "${arr[$idx]}"
}
そのようなことをするための通常の戦略は何ですか?変数$large_list
が空でした。
関数を変更して、引数リストの変更に適応させます。
記録のために、私はksh88を使用しており、可能な限りポータブルな答えを探しています。
[〜#〜] edit [〜#〜]:これまでのところ、私が思いつく最善の方法は、配列をループして各要素を関数の引数として送信することです。これは信じられないほど醜く、エラーが発生しやすいようです。言うまでもなく、すぐに制限に達します。これが私がしたことです:
foo () {
echo $*
}
cmd="foo "
while [[ $i -lt $MAX_ARR_SIZE ]]; do
cmd="$cmd ${large_list[$i]}"
((i=i+1))
done
eval $cmd
何か良いことはありませんか?
配列要素を引数として関数に渡すには、ksh構文を使用して配列の要素をリストとして展開します。
work_on_array "${myarray[@]}"
[@]
サフィックスは、これを配列の拡張にします。二重引用符は、各要素がさらに拡張されないように保護します(分割およびグロビング)。展開の結果は通常、通常は二重引用符で囲まれているような1つの単語ではなく、配列内の要素と同じ数の単語です。
配列の[〜#〜] n [〜#〜]番目の要素は${N}
。これにアクセスするには、eval
を使用する必要があります。参照 別の変数の「内部」で変数参照を使用
Bash 4.3以降には、おそらくkshに由来する方法があります。
echo_idx_array () # array index
{
local -n array=$1 # add nameref attribute
local idx=$2
echo "${array[idx]}"
}
$ names=(one two three four)
$ echo_idx_array names 2
three
$ days=([monday]=eggs [tuesday]=bread [sunday]=jam) # associative array
$ echo_idx_array days sunday
jam
declare -n
もご覧ください。
Korn Shellに依存します…最近のAT&T ksh93およびmkshバージョンはこれをサポートします:
function echo_idx_array {
nameref arr=$1
idx=$2
echo "${arr[idx]}"
}
set -A test -- a b c
echo_idx_array test 1
私の現在のシェルでは、これは「b」を出力します。