質問: 変数が空であるか、スペースのみが含まれているかどうかをテストするにはどうすればよいですか? 次のbash構文は、paramが空でないかどうかを確認します。 [[ ! -z $param ]] 例えば:param="" [[ ! -z $param ]] && echo "i am not zero" 出力なしとその罰金。ただし、paramが1つ(または複数)の空白文字を除いて空の場合、大文字と小文字は異なります。param=" " # one space [[ ! -z $param ]] && echo "i am not zero" 「ゼロではない」が出力されます。空白文字のみを含む変数を空と見なすようにテストを変更するにはどうすればよいですか?
回答: 最初に、 -z test は明示的に次のようになっていることに注意してください: 文字列の長さがゼロです つまり、スペースのみを含む文字列は、長さがゼロでないため、-zの下ではnotである必要があります。 パターン置換パラメーター展開 を使用して、変数からスペースを削除する必要があります。[[ -z "${param// }" ]] これはparam変数を展開し、パターン(単一のスペース)のすべての一致を何も置換しないため、スペースのみを含む文字列は空の文字列に展開されます。 それがどのように機能するかについての非常に正確 は、${var/pattern/string}がpatternの最初の最長一致をstringで置き換えることです。 (上記のように)patternが/で始まる場合、all一致を置き換えます。置換は空なので、最後の/とstringの値を省略できます。 $ {parameter/pattern/string} patternは、ファイル名展開と同じように展開されてパターンを生成します。 parameterが展開され、その値に対するpatternの最長一致がstring。 patternが「/」で始まる場合、patternのすべての一致はstring。通常、最初に一致したものだけが置き換えられます。 ...stringがnullの場合、patternの一致は削除され、/に続くpatternは省略できます。 結局、すべてのスペースを削除するために${param// }を使用します。ksh(元の場所)、zsh、bashには存在しますが、その構文はposixではないため、shスクリプトでは使用しないでください。