
この質問に対する回答がまだ完了しているかどうかはわかりません。見てみましたが、私がやりたいことに似たものが見つかりませんでした。
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を使用して繰り返すことができることを知っていますが、配列を使用する機能も失いたくありません。
どんなアイデアがありますか?
答え1
eval "$ARRAY_NAME"'+=("$VARIABLE_VALUE")'
zsh
(またはにも適用されますksh93
)。
あなたはksh88
次のようにする必要があります:
eval 'set -A '"$ARRAY_NAME"' "${'"$ARRAY_NAME"'[@]}" "${VARIABLE_VALUE}"'
答え2
Bashで次のことができることがわかりました。
eval typeset -a $(eval echo \${ARRAY_NAME})=\( $(eval echo \${${ARRAY_NAME}[*]}) "${VARIABLE_VALUE}" \)
私が変更したのは、(1)の前に追加し、eval
(2)私たちが設定した配列を区切る角かっこをエスケープすることでした。
typeset -a
ただし、交換後にkshで同じコマンドを実行するとset -A
失敗します。できますか:
typeset
/を完全に削除しますset
(変数に配列を割り当てると、暗黙的にその型が設定されると思いました)。2つのシェル関連コードが完全に分離されるようにコードを変更しますか?
+=
どちらの場合も、ここに公開されているコードは脆弱に見えます。 bashとkshの両方で使用できる追加の演算子を使用することをお勧めします。