0

bash で既に定義されている変数をインクリメントするにはどうすればよいですか? これが私が意味することです:

ID1="YAY1"
ID2="YAY2"
for (( c=1; c<=3; c++ ))
  do
    if [ "$SOMEOTHERVAR" = "ID$c" ]; then BLAH; fi
  done

問題は、比較を行うために既に定義されている変数をインクリメントすると、ID1 が YAY1 に等しいのではなく、ID$c が文字列 ID1 に等しいと見なされるため、if ステートメントが常に false と評価されることです。それが理にかなっていることを願っています。

ご協力ありがとうございました!

** * ***更新* ** * **

助けてくれてありがとう。最もクリーンな解決策は、単一の配列とカットを組み合わせて使用​​することでした。最もクリーンな方法ではないかもしれませんが、うまく機能します。以下にスニペットを示します。

# CONTACTS
declare -a EMAIL
EMAIL[1]="JS:jsmith@example.com"
EMAIL[2]="JD:jdoe@example.com"
EMAIL[3]="JK:jkennedy@example.com"

# FUNCTIONS
function EMAIL {
  for i in "${!EMAIL[@]}"; do
    POINTER="`echo ${EMAIL[$i]} | cut -d":" -f1`"; ADDRESS="`echo ${EMAIL[$i]} | cut -d":" -f2`";
    if [ "$POINTER" = "$PEMAIL" ]; then TO="$ADDRESS"; fi
    if [ "$POINTER" = "$SEMAIL" ]; then CC="$ADDRESS"; fi
  done
}

PEMAIL と SEMAIL は、スクリプトの別の部分でデータベースから取得されるコンパレータです。

4

3 に答える 3

1

あなたの例では、変数の最後の部分はとにかく整数であるため、配列を使用することは理にかなっています:

declare -a ids
ids[1]="YAY1"
ids[2]="YAY2"
for (( c=1; c < 3; c++ )); do
    if [ "$SOMEOTHERVAR" = "${ids[c]}" ]; then
        BLAH
    fi
done

常に整数になるとは限らず、bash 4 を使用している場合は、連想配列を使用できます。

declare -A ids
ids['glow']="YAY1"
ids['stix']="YAY2"
for c in glow stix; do
    if [ "$SOMEOTHERVAR" = "${ids[c]}" ]; then
        BLAH
    fi
done
于 2013-04-12T00:00:45.713 に答える
0

C スタイルのループを使用しないソリューション:

ID1="YAY1"
ID2="YAY2"

for name in ${!ID*}; do
  if [ "$SOMEOTHERVAR" == "${!name}" ]; then echo "match for $name"; fi
done

${!ID*} は、プレフィックス 'ID' を持つすべての変数のリストに展開されます。

于 2013-04-12T08:34:17.057 に答える