2016-10-03 13 views
1

私はスクリプトbash/sh/ksh の変数をたくさん比較したいかもしれません。 はおそらく配列であり、変数 が空であるかどうかを教えてください。 私はこのように思っていますが、うまくいきません。配列の値が空であるかどうかを確認する方法は?

ARRAY=(
bash="yes" 
cash="" 
trash="no" 
empty="" 
) 

for var in "${ARRAY[@]}"; do 
if [ "$var" == "$empty" ] 
then 
echo "$var is empty" 
else 
echo "$var is not empty" 
fi 
done 

あなたはbashの最近のバージョンにランタイム環境を制限する(またはは、ksh93の同等の構文をサポートするためのコードを変更)して喜んでいる場合は、私はこの

bash is not empty 
cash is empty... 
+0

[2 ] = "trash = no" [3] = "empty =") ''、あなたのキーがcurrenであることを示します「bash」、「cash」、「trash」、および「empty」の想定される値と対比して、「0」、「1」、「2」および「3」である。 –

答えて

2

のような出力をしたい、

とは対照的に、配列の構文を 上キーを反復する
#!/bin/bash 
#  ^^^^ -- specifically, bash 4.0 or newer 

declare -A array # associative arrays need to be declared! 
array=([bash]="yes" [cash]="" [trash]="no" [empty]="") 

for idx in "${!array[@]}"; do 
    if [[ ${array[$idx]} ]]; then 
    echo "$idx is not empty" 
    else 
    echo "$idx is empty" 
    fi 
done 

"${array[@]}"とは対照的に、"${!array[@]}"である。値を繰り返し処理するだけであれば、現在評価中の名前はわかりません。


また、アレイをまったく使用しないとします。あなたは同様に扱うことができるように意図した変数の名前空間を設定する別の方法は、それらをつけることである:

#!/bin/bash 

val_bash=yes 
val_cash= 
val_trash=no 
val_empty= 

for var in "${[email protected]}"; do 
    if [[ ${!var} ]]; then 
    echo "${var#val_} is not empty" 
    else 
    echo "${var#val_} is empty" 
    fi 
done 

これは(同様のbash 3.xの上で)働く"${[email protected]}"は、変数のリストに展開するのでprefixで始まる名前と"${!varname}"は、名前が変数varnameに格納されている変数の内容に展開されます。

+0

質問に「bash/sh/ksh」と書かれているように、おそらくシバン線を含めるべきです。 – choroba

+0

@choroba、よろしくお願いします。 –

1

配列要素を反復し、readのためのループ内には、変数を取得する=としてIFSを設定し、その値が空である場合、次にチェック二つの別々の変数の値は次のとおり

for i in "${array[@]}"; do 
    IFS== read var value <<<"$i" 
    if [ -z "$value" ]; then 
     echo "$var is empty" 
    else 
     echo "$var is not empty" 
    fi 
done 

出力:あなたは `ARRAY`を-p宣言し実行した場合、あなたは` -a ARRAYを宣言= '([0] = "bashの= yes" の[1] = "現金=" のような結果を得るでしょう

bash is not empty 
cash is empty 
trash is not empty 
empty is empty 
+0

OPのデータ構造が本当に不変であり、それが問題の正確なものであることを意図している場合、これは間違いありません。しかし、それは確かではありません - 彼らはsh/ksh/bashソリューションを受け入れることを喜んで話していますので、確かに構文に柔軟性があります。仕事のための正しいツールである構文を選択することが目的ならば、連想配列だけが賢明な選択肢であると主張したいと思います:数値的に配列された配列を反復して、必要な変数を見つける必要があるのは誰ですか? –

+0

@CharlesDuffy I second。連想配列は_right_データ構造です。 – heemayl

関連する問題