2012-02-28 7 views
4
#! /bin/bash 

echo "Please input 2 nums: " 

read a b 

if [ -z $b ]; then 
     echo b is zero ! 
fi 

if [ -n $b ]; then 
     echo b is non-zero ! 
fi 

スクリプトを実行するときは、入力1の数字だけを入力し、もう一方は空のままにして、次にbをnullにします。両方のエコーが出力されます。test -nとtest -zの両方がtrueの場合

-laptop:~$ ./test.sh 
Pleaes input 2 nums: 
5 
b is zero ! 
b is non-zero ! 

bは、ヌルでもなくヌルでもありません。誰でもこれについてコメントできますか?ありがとう!

+1

+1、および実際の出力:

は、これはまた、関数型プログラミングのようなものを持っていることを意味します。がんばろう! – shellter

+0

あなたがBashだけのために書いているのなら、あなたは '['条件を '[['。ここで推奨されている読書:http://mywiki.wooledge.org/BashFAQ/031 –

+0

あなたはここに競合状態があります。ファイルサイズは、2つの 'if'テストの間にディスク上で変更される可能性があります。コードに実際にこの形式がある場合は、代わりに 'else'を使用してください。 –

答えて

4

if [ -z "$b" ]; then 

if [ -z $b ]; then 

を交換し、同様に他のif状態で同じことを行います。

いくつかの興味深いテストについては、http://tldp.org/LDP/abs/html/testconstructs.htmlを参照してください。

+0

はい、うまくいきます!ありがとう。なぜ ""違いがあるのだろうか? –

+1

引用符を付けないと、初期化されていない変数は_nothing_と評価され、シェルは '' -z ''を評価します。これは、' '-z'が(真ではない)文字列として解析されるため真です。 –

+3

結論:他の希望の結果(たとえば複数のargへの展開)を妨げないように、常にあなたのものを引用します。 –

1

-nテストでは、文字列をテストブラケット内で引用する必要があります。 ! -zの引用符で囲まれていない文字列を使用するか、引用符で囲まれていない文字列だけを使っても問題はありませんが、これは安全ではありません。常にテスト済みの文字列を引用します。何も、歩留まりtrueに対する

$ b='' 
$ [ -z $b ] && echo YES # after expansion: `[ -z ] && echo YES` <==> `test -z && echo YES` 
YES 
$ [ -n $b ] && echo YES # after expansion: `[ -n ] && echo YES` <==> `test -n && echo YES` 
YES 

test

+0

あなたの答えをありがとう。しかし、あなたが言及しているように、テストで引用符で囲まれていない文字列は通常動作しますが、なぜこのケースは失敗しますか?いくつかのヒントを教えてください。 –

+0

もう一度ありがとう。 –

3

すべてが引用符で囲まれています。私はどこを覚えていませんが、誰かがこれを最近SOやUSEで説明しました - 引用符がなければ、空の/非空文字列のテストは実際にはありませんが、-nまたは-zであることを確認してください 。これを可能にするテストと同じです:

$ var=-n 
$ if [ "$var" ] 
then 
    echo whut 
fi 

返信whutです。あなたのコードを示すため

$ custom_test() { 
    if [ "$1" "$2" ] 
    then 
     echo true 
    else 
     echo false 
    fi 
} 

$ custom_test -z "$USER" 
false 
$ custom_test -n "$USER" 
true