for ループで未設定の変数をテストする

for ループで未設定の変数をテストする

ファイルを解析し、ファイル内の固定幅に応じて変数を設定するスクリプトを作成しました。

次に、各変数をチェックし、空白のフィールドの場合は「0」に設定します。これを簡単に変形すると次のようになります。

one=1  
two=""  
three=3  
four=""  

for num in $one $two $three $four  
do  
   echo num is $num  
done

出力は次のようになります:

num is 1   
num is 3

私がやりたいのは のコードですif $two is null then two=0

どうやってやるの?

答え1

-z比較演算子が必要です http://tldp.org/LDP/abs/html/comparison-ops.html

if [ -z $two ]; then   ## or [ -z $num ] to test them all 
    two=0
fi
echo "num is $num"

答え2

あなたの質問はあまり意味をなさない。まず、あなたが言うなら

one=1
two=""
three=3
four=""

for num in $one $two $three $four
do

このfor文は次のように解釈される。

for num in 1  3

したがって、とnumに等しい反復は 2 つだけです。 、(null)、 (null)に等しい反復を 4 つにしたい場合は、次のように記述する必要があります。13num13

for num in "$one" "$two" "$three" "$four"

正当な理由がなく、自分が何をしているのかわかっている場合を除き、シェル変数参照を引用符で囲む必要があります。

それで、

for num in "$one" "$two" "$three" "$four"
do
    echo "num is $num"
done

結果的に

num is 1
num is 
num is 3
num is 

さて、結果を、、、、としたい場合、1それは単純に次のように言うだけです。030

for num in "$one" "$two" "$three" "$four"
do
    if [ "$num" = "" ]
    then
        num=0
    fi
    echo "num is $num"
done

ご了承ください

  • の前後には空白が必要です[
  • の前後には空白が必要です=
  • の前に空白文字が必要です] (その後に何かある場合は、その後にも空白文字が必要です)。
  • fi逆から綴られますif

しかし、あなたの質問のタイトルには「変数の設定を解除」と書かれていtwoます。  fourセット空白文字列に、 fiveおよびsix(およびorange、、pumpkinおよびtiger他の可能性のある変数名の準無限リスト)は設定解除違いがあります。それあなたが興味を持っていることなら、別の質問をする必要があります。

for num in "$one" "$two" "$three" "$four" "$five" "$six" "$orange" "$pumpkin" "$tiger"
do

すると、、、、およびの反復を、およびのfive反復と区別する ことができなくなり、 7 つのケースすべてで は空の文字列に設定されます。および(など) 変数を直接テストする必要があります。sixorangepumpkintigertwofournum$four$five

PS: 新しい質問をするのではなく、検索してください。これは以前に回答されています。

関連情報