2つの配列があり、ARRAY1の対応する値に基づいてARRAY2の値を印刷したいと思います。
#!/usr/bin/env bash
ARRAY1=(bb.service.sql bw.service.sql)
ARRAY2=(bb bw)
case $ARRAY1[@] in
${ARRAY1[1]})
echo ${ARRAY2[1]} ;;
*)
echo "unknown" ;;
esac
しかし、私はまだunknown
ここまで来ています。私は何が間違っていましたか?
ベストアンサー1
$ARRAY1
${ARRAY1[0]}
bash
in(kshからコピーした奇妙なデザイン)の略語です。
$ARRAY1[@]
と同じな${ARRAY[0]}[@]
ので、インデックス0の要素の値の後にはリテラルが続きます[@]
。多くの言語と多くのシェル(csh
配列を持つ最初のシェルから始まる)では、$array[1]
kshと同様にbashで配列をインデックスできますが、これを行う必要があります${array[1]}
。これは、配列のないBourneシェルとの下位互換性を維持するために行われます。
${array[@]}
配列のすべての要素に展開されますが、ここではcase
文字列のみが一致するため、要素はスペースで連結されてcase
一致します。
また、配列を割り当てるときはarray=(foo bar)
1以外をfoo
入力してください${array[0]}
(kshと同じですが、array=(values...)
この構文のソースであるzshを含む他のほとんどのシェルとは異なり)。
とにかく、あなたがそれで何をしたいのか明確ではありません。
bb
にマッピングしたい場合がありますbb.service.sql
。この場合、連想配列を使用することをお勧めします。
#! /bin/bash -
typeset -A map=(
[bb]=bb.service.sql
[bw]=bw.service.sql
)
first_parameter=${1?}
corresponding_sql=${map[$first_parameter]?}
(?
変数を設定しないとエラーが発生します。)