programA
だから私は次のような出力を提供するプログラム(例えば)を持っています:yes
、、、、、、、、。no
maybe
probably
possibly
impossible
banana
私はその出力に基づいて何かを実行するスクリプトを作成したいと思います。yes
、maybe
および考慮するだけでよいとしましょう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
正規表現の周りに引用符を含めることはできず、部分文字列が一致をトリガーできないようにするため、および^
アンカーの間に単語置換単語が含まれます(たとえば、パターンでキャプチャされるなど)。$
yessir
yes
答え2
そのバージョンはetcと一致する - のすべての部分文字列をキャプチャするので、ここほど信頼if
できません。
case
yesmaybebanana
b
bebana
#!/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
case
1行に複数の単語を使用すると、バージョンを大幅に簡素化できます。
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