シェルスクリプトで文字列が空でもスペースでもないことを確認する


91

文字列がスペースでも空でもないことをチェックするはずの次のシェルスクリプトを実行しようとしています。ただし、上記の3つの文字列すべてで同じ出力が得られます。"[["構文も使用しようとしましたが、役に立ちませんでした。

これが私のコードです:

str="Hello World"
str2=" "
str3=""

if [ ! -z "$str" -a "$str"!=" " ]; then
        echo "Str is not null or space"
fi

if [ ! -z "$str2" -a "$str2"!=" " ]; then
        echo "Str2 is not null or space"
fi

if [ ! -z "$str3" -a "$str3"!=" " ]; then
        echo "Str3 is not null or space"
fi

次の出力が表示されます。

# ./checkCond.sh 
Str is not null or space
Str2 is not null or space

回答:


121

の両側にスペースが必要!=です。コードを次のように変更します。

str="Hello World"
str2=" "
str3=""

if [ ! -z "$str" -a "$str" != " " ]; then
        echo "Str is not null or space"
fi

if [ ! -z "$str2" -a "$str2" != " " ]; then
        echo "Str2 is not null or space"
fi

if [ ! -z "$str3" -a "$str3" != " " ]; then
        echo "Str3 is not null or space"
fi

どうもありがとうございました。しかし、比較では比較するのに割り当てがスペースを使用しないのはなぜでしょうか。
Shubhanshu Mishra

5
^^それは構文です。コマンドラインの最初の単語はコマンドで、後続の単語は引数です。var=value [command [args]]は、変数に値が割り当てられる構文です。比較のために、[/usr/bin/[)はコマンドです。var1、!=&var2は3つの別々の引数である必要があります。var1!= var2は単一の引数です。
anishsane

61

シェルで空の文字列をチェックするため

if [ "$str" == "" ];then
   echo NULL
fi

または

if [ ! "$str" ];then
   echo NULL
fi

9
シェルの文字列等価演算子は=です。これ==は、若いプログラマーの心を台無しにするためにシェルの作者によって考案された移植性のないハックです。
イェンス

17

単一のスペースだけでなく、任意の量の空白に対してチェックする必要がある場合は、これを行うことができます:

余分な空白の文字列を取り除くには(中央の空白も1つのスペースに凝縮します):

trimmed=`echo -- $original`

--場合ことを保証し$original、エコーが理解スイッチが含まれ、それらはまだ通常の引数として考慮することがありますがこだまします。また、それは入れていないことが重要です""周り$original、またはスペースは削除されません。

その後、$trimmed空かどうかを確認できます。

[ -z "$trimmed" ] && echo "empty!"

3
ボーンシェルでは、トリミングされた値として「-」が返されます。
Sridhar Sarnobat

この投稿によると、echoは解釈しません-オプションの終わりを意味します。私のBashシェルでは、Sridhar Sarnobatと同じ結果が得られます
Mr.C

9

文字列にスペース以外の何かがあるかどうかの別の簡単なテスト。

if [[ -n "${str// /}" ]]; then
    echo "It is not empty!"
fi

「-n」は、ゼロ以外の長さの文字列を意味します。

次に、最初の2つのスラッシュは、以下のすべてのスペースに一致することを意味します。次に、3番目のスラッシュの後に置換(空の)文字列が続き、 "}"で閉じます。通常の正規表現構文との違いに注意してください。

bashシェルスクリプトでの文字列操作の詳細については、こちらをご覧ください


[[ -n "$1" ]]同じではありません[[ ! -z "$1" "]]か?
Alexander Mills

@AlexanderMillsが正しい、-nを使用すると少し短くなります。私はそれに応じて答えを更新しました。
elomage


1
[ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty"

文字列からすべての改行とスペースを削除すると、空白のものが改行されて何もない状態になり、テストして実行できます。

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