変数に改行文字のみが含まれているかどうかを確認する方法

変数に改行文字のみが含まれているかどうかを確認する方法

$last_cmdZshの変数に改行のみが含まれていて、他に何もないことを確認する方法は何ですか?

理想的には、これを置き換えることによって行われます。これはプロンプトスクリプトの一部であり、非常に高速である必要があるためです。

以下は私にbad substitutionエラーを与えます:

if [[ -n "${$last_cmd/\n/}" ]]; then
  no_new_lines=1
fi

基本的には次のようなものが欲しい。

if [[ -n "$(echo -n $last_cmd)" ]]; then
  no_new_lines=1
fi

答え1

正規表現を使用してください。

if [[ $1 =~ ^$'\n'*$ ]]; then
  echo empty or only contains newlines
else
  echo contains non-newline characters 
fi

ワイルドカードを使用して改行文字のみを直接テストするのではなく、改行文字以外の文字があるかどうかをテストします。

if [[ $1 == *[^$'\n']* ]]; then
  echo contains non-newline characters 
else
  echo empty or only contains newlines
fi

または簡単なsh方法:

nl='
'
case $1 in
  *[!$nl]*) echo contains non-newline characters;;
  *) echo only contains newlines;;
esac

ワイルドカードを使用して前方一致を実行するには、# extendedglob演算子(*正規表現演算子と同じ)が必要です。

set -o extendedglob
if [[ $1 == $'\n'# ]]; then
  echo empty or only contains newlines
else
  echo contains non-newline characters 
fi

関連情報