値を確認したい変数名に変数を追加するにはどうすればよいですか?私のコードは次のようになり、実行するとエラーが発生します。
[: A_variable: integer expression expected
変数に対してifを実行するとき、正しい構文は次のようにする必要があるためだと思います。 if [ $ A_variable -eq 1 ];しかし、別の変数を入れるので、変数の前にドル記号を入れることはできません。
ほとんど次のようになります: if [ $${letter}_variable またはいくつかの混合ですが、何がわかりません。
array=("A" "B" "C")
A_variable=1
B_variable=2
for letter in "${array[@]}"
do
if [ ${letter}_variable -eq 1 ]; then
...
答え1
これは…間接拡張バッシュから。
他の変数によって名前が決定される変数の値を取得する構文は、次のnamevar
とおりです。
${!namevar}
変数名は変数と定数文字列で構成されるため、中間ステップが必要です。
array=("A" "B" "C")
A_variable=1
B_variable=2
for letter in "${array[@]}"
do
varname="${letter}_variable"
if [ "${!varname}" -eq 1 ]; then
...
メモ:間接的に参照された変数が実際に存在しない場合、拡張すると空の文字列が生成され、まだエラーが発生します。これが望ましくない場合は、最初に次の2番目のテストを追加します。
varname="${letter}_variable"
if [ "${!varname}" = "" ]; then
echo "Error: $varname is non-existent or empty"
elif [ "${!varname}" -eq 1 ]; then
...
さらに、一致するすべての変数の内容が事前に安全な値に初期化されていない場合は、拡張結果に予期しない文字が表示されないように二重引用符を使用することをお勧めします。
答え2
文字列(「A_variable」)を整数(「1」)と比較しています。
を使用してこの問題を解決できますdeclare -n
。からhelp declare
:
-n は、NAME を値の名前付き変数への参照にします。
[[ .. ]]
「C_variable」が設定されていないために発生するエラーを避ける必要があります。
#!/bin/bash
array=("A" "B" "C")
A_variable=1
B_variable=2
for letter in "${array[@]}"
do
declare -n foo="${letter}_variable"
if [[ "$foo" -eq 1 ]]; then
echo "Ding"
fi
done
ボーナス:declare -i A_variable=1
整数にすることができます。
-iはNAMEに「整数」属性を持つようにします。
答え3
この演算子-eq
は数学式用ですが、文字列を比較することです。
文字列を比較するにはを使用します=
。