Bashで変数が空かどうかを確認する方法


262

Bashで変数が空かどうかを確認するにはどうすればよいですか?


2
どの種類のシェルスクリプトですか?* nix?
TJクラウダー

8
bashシェルスクリプト
Tree



回答:


383

Bashでは、少なくとも次のコマンドで$ varが空かどうかをテストします

if [[ -z "$var" ]]; then
   # Do what you want
fi

コマンドman testはあなたの友達です。


62
二重の角括弧はここでは役に立たない。それは...テスト-z「VAR」であれば、単純な[-z「$ VAR」]、あるいは簡単に私見かもしれとにかく1 :)
ルカBorrione

2
二重の角括弧は役に立たない、私が含まれていないのなら./test.ksh[8]: test: argument expected理由は分からないが、単一の括弧は機能しなかったが、二重の括弧はそれがあった。
gahlot.jaggs 2013年

8
@LucaBorrioneってことだよif test -z "$var"ね?
neu242 2014

1
質問で直接言及されていない特定の状況に対する追加のコメント:変数が設定されておらず、set -uオプションがアクティブになっている場合、このテストはで失敗しunbound variableます。この場合、@ alexliのソリューションを使用することをお勧めします。
ノール

3
@LucaBorrione後半のメモと同様に、「[[」は「決して役に立たない」と見なすことができます。「[[」を使用すると、「[」よりもいくつかの利点があります(たとえば、stackoverflow.com
questions / 669452 /…を

107

Bashの推定:

var=""

if [ -n "$var" ]; then
    echo "not empty"
else
    echo "empty"
fi

9
より直接的な答えは-z[[ -z "$an_unset_or_empty_var" ]] && echo empty
グレン・ジャックマン

4
@glenn jackman:良いコメント; -z尋ねられたことに近いというのは本当です。ジェイは彼の答えにこれを入れたので、私は私の更新を控え、これをそのままにしておきます。
ChristopheD

48

私も見ました

if [ "x$variable" = "x" ]; then ...

これは明らかに非常に堅牢でシェルに依存しません。

また、「空」と「未設定」には違いがあります。Bashシェルスクリプトで文字列が定義されていないかどうかを確認する方法をご覧ください。


私には奇妙に見えます。この解決策を説明していただけませんか。ありがとうございました。
guettli 2015年

2
@guettli:$variable空の場合、比較演算子の左側の文字列はonly xになり、演算子の右側の文字列と等しくなります。[ x = x ]は「true」なので、実際に$variableは空かどうかをテストします。補足として(事実の3年半後:-))私はこれを自分で使用することはないでしょう。なぜなら-z、私はおそらくより明確な方法で望んでいることをするからです。おそらく、私とは異なる経験をした人が故意にこのように書いたのでしょう。
Daniel Andersson

30
if [ ${foo:+1} ]
then
    echo "yes"
fi

yes変数が設定されている場合に出力します。${foo:+1}変数が設定されている場合は1を返し、それ以外の場合は空の文字列を返します。


2
質問には記載されていませんが、この回答の重要な利点は、変数が未定義でset -uオプション(nounset)がアクティブになっている場合でも機能することです。unbound variableこの場合、この質問に対する他のほとんどすべての回答は失敗します。
アルコール

この:+表記法は、オプションの変数で指定したオプションのコマンドラインパラメーターがある場合にも役立ちます。 myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
アランポーター


10
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}

変数

@ehimeを使用して、使用するデフォルト値を作成します${variable:-default_value}
warvariuc '17年

設定されていない場合、これは、変数と、出口のエントリの妥当性をチェックするための簡単な方法です: [ "$variable" ] || exit
マルセルSonderegger

8

これはtrue、変数が設定されていない場合、または空の文字列( "")に設定されている場合に返されます。

if [ -z "$MyVar" ]
then
   echo "The variable MyVar has nothing in it."
elif ! [ -z "$MyVar" ]
then
   echo "The variable MyVar has something in it."
fi

3
elif !代わりになぜ使用するのelseですか?
ZiggyTheHamster

1
ただ、すなわち使用して、二つの文の区別を作るために! [ -z "$MyVar" ]、変数をすることを意味していて中に何かを。しかし、理想的にはを使用しますelse
3kstc 2017年

6

質問は尋ねる変数が空の文字列であるかどうかを確認する方法と最高の回答はすでにそのために与えられています。

しかし、PHPでのプログラミングの期間が経過した後、私はここに着陸し、実際にはPHPの空の関数のようなチェックを探していましたは、Bashシェルで動作するいました。

答えを読んだ後、私はバッシュで適切に考えていなかったことがわかりましたが、とにかくその瞬間、空のような機能 PHPのは私のBashコードではとても便利でした。

これは他の人にも起こり得ると思うので、BashでPHPのempty関数を変換することにしました。

PHPマニュアルによると:

変数が存在しない場合、またはその値が次のいずれかである場合、変数は空と見なされます。

  • ""(空の文字列)
  • 0(0は整数)
  • 0.0(フロートとして0)
  • "0"(文字列として0)
  • 空の配列
  • 宣言された変数、ただし値なし

もちろん、nullfalseのケースはbashで変換できないため、省略されます。

function empty
{
    local var="$1"

    # Return true if:
    # 1.    var is a null string ("" as empty string)
    # 2.    a non set variable is passed
    # 3.    a declared variable or array but without a value is passed
    # 4.    an empty array is passed
    if test -z "$var"
    then
        [[ $( echo "1" ) ]]
        return

    # Return true if var is zero (0 as an integer or "0" as a string)
    elif [ "$var" == 0 2> /dev/null ]
    then
        [[ $( echo "1" ) ]]
        return

    # Return true if var is 0.0 (0 as a float)
    elif [ "$var" == 0.0 2> /dev/null ]
    then
        [[ $( echo "1" ) ]]
        return
    fi

    [[ $( echo "" ) ]]
}



使用例:

if empty "${var}"
    then
        echo "empty"
    else
        echo "not empty"
fi



デモ:
次のスニペット:

#!/bin/bash

vars=(
    ""
    0
    0.0
    "0"
    1
    "string"
    " "
)

for (( i=0; i<${#vars[@]}; i++ ))
do
    var="${vars[$i]}"

    if empty "${var}"
        then
            what="empty"
        else
            what="not empty"
    fi
    echo "VAR \"$var\" is $what"
done

exit

出力:

VAR "" is empty
VAR "0" is empty
VAR "0.0" is empty
VAR "0" is empty
VAR "1" is not empty
VAR "string" is not empty
VAR " " is not empty

Bashロジックでは、この関数でのゼロのチェックは副次的な問題を引き起こす可能性があると述べましたが、この関数を使用する人は誰でもこのリスクを評価し、おそらく最初のチェックのみを残してこれらのチェックを切り捨てることを決定する必要があります。


2

未設定の変数と、設定されて空の変数を区別したい場合があります。

is_empty() {
    local var_name="$1"
    local var_value="${!var_name}"
    if [[ -v "$var_name" ]]; then
       if [[ -n "$var_value" ]]; then
         echo "set and non-empty"
       else
         echo "set and empty"
       fi
    else
       echo "unset"
    fi
}

str="foo"
empty=""
is_empty str
is_empty empty
is_empty none

結果:

set and non-empty
set and empty
unset

ところで、私はset -uそれを使用することをお勧めします。設定されていない変数を読み取るときにエラーが発生します。これは次のような災害からあなたを救うことができます

rm -rf $dir

これと「厳密モード」のその他のベストプラクティスについては、こちらをご覧ください


厳格なモードリファレンスをありがとう!
paulcm 2016

1

変数vが設定されていないかどうかを確認するには

if [ "$v" == "" ]; then
   echo "v not set"
fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.