web-dev-qa-db-ja.com

配列名として変数を使用してbashで配列を作成します

これが答えられたかどうかはわかりませんが、私がやろうとしていることのように見えるものは何も見つかりませんでした。

Kshまたはbashシェルに対して実行できるシェルスクリプトがいくつかあり、それらは配列を利用します。実行中のシェルに問い合わせて、配列の作成に使用する組み込み関数を決定する「setArray」という名前の関数を作成しました。kshの場合はset -A、bashの場合はtypeset-aです。ただし、bash部分に問題があります。

この関数は、配列の名前と追加する値の2つの引数を取ります。これは$ {ARRAY_NAME}と$ {VARIABLE_VALUE}になります。次のことを行います。

set -A $(eval echo \${ARRAY_NAME}) $(eval echo \${${ARRAY_NAME}[*]}) "${VARIABLE_VALUE}"

kshで完全に機能します。しかしながら、

typeset -a $(eval echo \${ARRAY_NAME})=( $(eval echo \${${ARRAY_NAME}[*]}) "${VARIABLE_VALUE}" )

ではない。これは提供します

bash: syntax error near unexpected token '('

文字列のリスト(例:MYARRAY = "one two three")を作成し、IFSを使用してループするだけでよいことはわかっていますが、配列を使用する機能も失いたくありません。

何かご意見は ?

3
Kevin Huntly
eval "$ARRAY_NAME"'+=("$VARIABLE_VALUE")'

zshまたはksh93でも機能します)。

ksh88は次のようになります。

eval 'set -A '"$ARRAY_NAME"' "${'"$ARRAY_NAME"'[@]}" "${VARIABLE_VALUE}"'
3

私は以下がbashで機能することを発見しました:

eval typeset -a $(eval echo \${ARRAY_NAME})=\( $(eval echo \${${ARRAY_NAME}[*]}) "${VARIABLE_VALUE}" \)

私が行った変更は、(1)evalの先頭に追加すること、および(2)作成する配列を区切る括弧をエスケープすることです。

ただし、typeset -aset -Aに置き換えた後、kshで実行された同じコマンドは失敗します。次のいずれかを行うことができますか?

  • typeset/setを完全に削除する(変数に配列を割り当てると、暗黙的にその型が設定されると思います)、または

  • シェル固有のコードの2ビットが完全に分離されるようにコードを変更しますか?

どちらの場合も、ここに投稿されたスニペットは壊れやすいようです。追加演算子+=を使用する方がよい場合があります。これは、bashとkshの両方で使用できるようです。

0
dhag