単語リストでif文を使用する

単語リストでif文を使用する

programAだから私は次のような出力を提供するプログラム(例えば)を持っています:yes、、、、、、、、。nomaybeprobablypossiblyimpossiblebanana

私はその出力に基づいて何かを実行するスクリプトを作成したいと思います。yesmaybeおよび考慮するだけでよいとしましょうbanana

これまで私がしなければならないcaseことは、次のように使用するだけです。

case $program_output in
  yes) echo "good word: $program_output" ;;
  maybe) echo "good word: $program_output" ;;
  banana) echo "good word: $program_output" ;;
  *) echo "bad word: $program_output" ;;
esac

しかし、最近この文章で遊んで、if次のようにすればはるかに速くできることがわかりました。

if [[ "yesmaybebanana" =~ ${program_output} ]]; then
  echo "good word: ${program_output}"; else echo "bad word: ${program_output}";
fi

私がその言葉を使うべきではない理由はありますかif?この場合、$program_outputスペースを含めることはできず、出力できる単語のリストが制限されます。

答え1

bash正規表現関数を使用する場合(ただしbash特定の関数なので移植可能ではありません)、少なくとも正しい「OR」型演算子を使用してANDを強制する必要があります。一つ次の単語が許可されます。

if [[ $program_output =~ ^(yes|maybe|banana)$ ]]
then
    echo "Good word: $program_output"
else
    echo "Bad word: $program_output"
fi

正規表現の周りに引用符を含めることはできず、部分文字列が一致をトリガーできないようにするため、および^アンカーの間に単語置換単語が含まれます(たとえば、パターンでキャプチャされるなど)。$yessiryes

答え2

そのバージョンはetcと一致する - のすべての部分文字列をキャプチャするので、ここほど信頼ifできません。 caseyesmaybebananabbebana

#!/usr/bin/env bash

program_output='bebana'

if [[ "yesmaybebanana" =~ ${program_output} ]]; then echo "good word: ${program_output}"; else echo "bad word: ${program_output}"; fi

出力:

good word: bebana

そして移植性がありません。ダッシュで実行してみてください。

$ dash ./a.sh
./a.sh: 6: ./a.sh: [[: not found
bad word: bebana

case1行に複数の単語を使用すると、バージョンを大幅に簡素化できます。

case $program_output in
  yes | maybe | banana) echo "good word: $program_output" ;;
  *) echo "bad word: $program_output" ;;
esac

答え3

バッシュ拡張モードここでも働いています:

if [[ $program_output == @(yes|maybe|banana) ]]
then
    echo "program output is one of yes, maybe, banana"
fi

関連情報