変数が空であるか空白のみが含まれているかどうかをテストする方法は?

変数が空であるか空白のみが含まれているかどうかをテストする方法は?

次の bash 構文はparam空でないことを確認します。

 [[ !  -z  $param  ]]

たとえば、

param=""
[[ !  -z  $param  ]] && echo "I am not zero"

出力できませんが大丈夫です。

ただし、param1つ以上の空白文字を除いて空白の場合、状況は異なります。

param=" " # one space
[[ !  -z  $param  ]] && echo "I am not zero"

「私はゼロではない」を出力します。

空白文字のみを含む変数を空白として扱うようにテストをどのように変更できますか?

答え1

まず注意事項-zテスト明示的に使用される用途:

文字列の長さは0です。

つまり、スペースのみを含む文字列はいいえ-z長さがゼロではないため、次は真です。

必要なのは、以下を使用して変数からスペースを削除することです。パターン置換パラメータの拡張:

[[ -z "${param// }" ]]

これはparam変数を拡張し、パターンのすべての発生(空白1つ)を何でも置き換えるため、空白のみの文字列は空の文字列に展開されます。


これ仕組みの本質${var/pattern/string}最初に最も長い一致を次に置き換えます。 (上記のように)起動すると置き換えられます。patternstringpattern/みんな大会。代替項目が空であるため、最終値/string値を省略できます。

${パラメータ/パターン/文字列}

これ模様ファイル名拡張と同様に、パターンを生成するために拡張されます。範囲拡張され、最も長い一致模様その値は次のように置き換えられます。ひも。もし模様「/」で始まるすべての一致模様に置き換えられますひも。通常、最初の発生のみが置き換えられます。 ...もしひも空、一致模様削除されたおよび/または下模様省略可能です。

最後に、私たちは${param// }すべてのスペースを削除しました。

ksh(オリジナル)とにありますが、zshこのbash構文はPOSIXではないため、shスクリプトに使用しないでください。

答え2

文字列に認証されたセットの文字のみが含まれていることを確認する簡単な方法は、認証されていない文字があるかどうかをテストすることです。したがって、文字列にスペースのみが含まれているかどうかをテストするのではなく、文字列にスペース以外の文字が含まれているかどうかをテストします。 Bash、kshまたはzshから:

if [[ $param = *[!\ ]* ]]; then
  echo "\$param contains characters other than space"
else
  echo "\$param consists of spaces only"
fi

「空白のみで構成」には、空(または設定されていない)変数の場合が含まれます。

空白文字があるかどうかをテストできます。ロケール設定を使用するか、空白、タブ、改行[[ $param = *[^[:space:]]* ]]などのテストしたい空白文字の明示的なリストを使用してください。[[ $param = *[$' \t\n']* ]]

=内部パターンと文字列を一致させる[[ … ]]のはksh拡張です(bashとzshにもあります)。 Bourne / POSIXスタイルでは、このcase設定を使用して文字列をパターンと一致させることができます。ほとんどの正規表現構文とは異なり、標準シェルパターンは!文字セットを無効にするために使用されます。^

case "$param" in
  *[!\ ]*) echo "\$param contains characters other than space";;
  *) echo "\$param consists of spaces only";;
esac

空白文字をテストするには、$'…'構文はksh / bash / zshにのみ適用されます。これらの文字を文字通りスクリプトに挿入するか(バックスラッシュ+改行がnullに拡張されるため、改行は引用符で囲む必要があります)、たとえば生成できます。

whitespace=$(printf '\n\t ')
case "$param" in
  *[!$whitespace]*) echo "\$param contains non-whitespace characters";;
  *) echo "\$param consists of whitespace only";;
esac

答え3

POSIX的に:

case $var in
  (*[![:blank:]]*) echo '$var contains non blank';;
  (*) echo '$var contains only blanks or is empty or unset'
esac

区別するためにスペース空白ではない未設定:

case ${var+x$var} in
  (x) echo empty;;
  ("") echo unset;;
  (x*[![:blank:]]*) echo non-blank;;
  (*) echo blank
esac

[:blank:]水平インターバル文字に使用されます(ASCIIのスペースとタブ。ただし、ユーザーのロケールにはより多くの文字がある可能性があります。一部のシステムでは可能な場合は改行防止スペースを含めますが、一部のシステムではそうではありません)。縦間隔文字(改行や給紙など)も必要[:blank:]に応じて置き換えます[:space:]

答え4

if [[ -n "${variable_name/[ ]*\n/}" ]]
then
    #execute if the the variable is not empty and contains non space characters
else
    #execute if the variable is empty or contains only spaces
fi

関連情報