2013-10-03 15 views
5

bash変数を調べ、nullの場合はそれを判断する正しい構文を探します。そうでない場合は続行します。Bash If文のヌル

変数が空の場合、おそらくif [ $lastUpdated = null?; then... else...

+0

ない「ヌル」値はbashではありません:天候変数が設定されていないが、空の文字列とうまくある、ゴードンDavissonの答えが進むべき道であると確認してください。文字列は空でも構いません。あなたは '$ lastUpdated'の値をどのように設定しますか? –

+1

「ヌル」とはどういう意味ですか? – zoska

+1

いくつかの文脈では、 '$ {lastUpdated:= never}'や '$ {lastUpdated:-never}'などの表記が適切かもしれません。 [パラメータの拡張](http://www.gnu.org/software/bash/manual/bash.html#Shell-パラメータ - 展開)を参照してください。 –

答えて

10

ただ、テストのようなものは:

if [ -z "$lastUpdated" ]; then 
    # not set 
fi 
+0

ヌル値の変数(空の文字列が割り当てられている)と未設定の変数の間に違いがあります。この答えはその区別を検出しません。 – chepner

+0

@chepnerありますか?それを拡張してください。 – trojanfoe

+0

割り当ての前に、変数は設定されていません。 'FOO ='(値なし)は 'FOO =" "'と同じです。これは 'FOO'の値を空の文字列に設定します。さまざまなパラメータ拡張( '$ {FOO:-default}'と '$ {FOO-default}')は、この区別を可能にします。あなたが使っているような未定義変数の引用された展開は、空の文字列に展開されるので、 '-z'は2つの状態を区別できません。 – chepner

2

はchepnerのコメント@に拡大し、ここであなたはおそらく空に設定するのではなくて(未設定のテストができる方法です値)変数は:

if [ -z "${lastUpdated+set}" ]; then 

${variable+word}構文は$variableが設定されていない場合は、空の文字列を与え、

$ fullvar=somestring 
$ emptyvar= 
$ echo "<${fullvar+set}>" 
<set> 
$ echo "<${emptyvar+set}>" 
<set> 
$ echo "<${unsetvar+set}>" 
<> 
+0

式に引用符を入れずに '[-z $ {lastUpdated + set}];'にしても問題ありません。[このSOの回答](https://stackoverflow.com/questions/3601515/how-to-check-if-a-variable-is-set-in-bash)で詳しい説明があります。 – panepeter

+1

@panepeter真実ですが、私が経験したことは、変数参照を二重引用符で囲むだけで、安全な状態にするのがより簡単で安全であることがわかります。この場合、詳細な説明( '[-z]'とは何かを理解することを含む)と二重引用符を使う方がずっと簡単です。別の言い方をすると、もし誰かが '[-z $ {lastUpdated + set}]'がセット変数をテストする良い方法だと考えるなら、 '[-n $ {lastUpdated + set}] 'は未設定の変数をテストする良い方法ですが、完全に失敗します。 –

2

をそれをすべてまとめると::bashのでは本当のヌル値はありません、設定されていた場合、文字列「言葉」。 Chepnerのコメントは次の点にあります。

bashのドキュメントでは、空文字列の同義語としてnullが使用されています。あなたが本当にやりたいことは未設定または空ののチェック(すなわち「」、すなわちある場合

if [ "${lastUpdated}" = "" ]; then 
    # $lastUpdated is an empty string 
fi 

したがって、ヌルをチェックすると、空の文字列のチェックを意味します'ヌル')変数、trojanfoeのアプローチを使用します。

if [ -z "$lastUpdated" ]; then 
    # $lastUpdated could be "" or not set at all 
fi 

あなたがしたい場合は

if [ -z ${lastUpdated+set} ]; then 
    # $lastUpdated is not set 
fi 

Parameter Expansionはここで何が起こっているのかである)

+1

'-eq'は整数を比較するためのものです。文字列を比較するには '='が必要です。 –

関連する問題