非常に大きな配列があることを考えると、$large_list
配列をパラメータとして使用する関数を作成する方法はありますか?たとえば、
echo_idx_array () {
arr="$1"
idx="$2"
echo "${arr[$idx]}"
}
このようなタスクを実行する一般的な戦略は何ですか?変数を提供しようとしましたが$large_list
空です。
パラメータリストの変更に合わせて関数を変更します。
ちなみに私はksh88を使用しており、できるだけ移植可能な答えを探しています。
編集する:これまで私が考える最善の方法は、配列を繰り返して各要素をパラメータとして関数に送信することです。これは非常に見苦しく、エラーが発生しやすく、特定の制限に非常に迅速に到達するしかないことは言うまでもありません。これが私がしたことです:
foo () {
echo $*
}
cmd="foo "
while [[ $i -lt $MAX_ARR_SIZE ]]; do
cmd="$cmd ${large_list[$i]}"
((i=i+1))
done
eval $cmd
もっと良いことはないでしょうか?
答え1
配列要素を関数に引数として渡すには、ksh構文を使用して配列要素をリストに展開します。
work_on_array "${myarray[@]}"
サフィックスは[@]
配列拡張を作成します。二重引用符は、各要素が追加の拡張(分割およびワイルドカード)から保護されます。拡張の結果は通常、二重引用符のように1つの単語ではなく、配列内の要素の数だけ単語です。
これ窒素次に、配列の最初の要素は次のようになります。アクセスするには、次を参照してください。${N}
eval
他の変数「内部」で変数参照を使用する
答え2
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
。
答え3
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」が出力されます。