回答:
これは、正規表現を使用するBash専用(> =バージョン3)ソリューションです。
if [[ "$WORD" =~ ^(cat|dog|horse)$ ]]; then
echo "$WORD is in the list"
else
echo "$WORD is not in the list"
fi
単語リストが長い場合は、ファイル(1行に1単語)に保存して、これを実行できます。
if [[ "$WORD" =~ $(echo ^\($(paste -sd'|' /your/file)\)$) ]]; then
echo "$WORD is in the list"
else
echo "$WORD is not in the list"
fi
ファイルアプローチの注意点:
ファイルに空白が含まれていると壊れます。これは次のようなもので修正できます。
sed 's/[[:blank:]]//g' /your/file | paste -sd '|' /dev/stdin
おかげで、適切でパターンを固定するために私を思い出させるために@terdonする^
と$
。
[[
と]]
- を使用する必要があり、十分[
で]
はないことに注意してください。
[[ "$ARG" =~ ^(true|false)$ ]] || { echo "Argument received invalid value" ; exit 1 ; }
case $word in
dog|cat|horse) echo yes;;
*) echo no;;
esac
私はスクリプトの引数を検証するために「1行」のソリューションを探していましたが、上記のJoseph R.の回答を使用して思い付きました:
[[ "$ARG" =~ ^(true|false)$ ]] || { echo "Argument received invalid value" ; exit 1 ; }
リストを頻繁に変更したり、複数のスクリプトで共有したりする場合に備えて、単語のリストをファイルに入れたい場合があります。また、リストがスクリプトで管理するには長すぎる場合は、単語をファイルに入れる必要があります。その後、あなたは言うことができます
if fgrep –qx "$WORD" word_list
fgrepを使用して、許可されるすべての単語を指定できます。
if $(echo "$WORD" | fgrep -wq -e dog -e cat -e horse) ; then
echo yes
else
echo no
fi
-w
フラグは唯一のフル言葉と一致して、-q
フラグが(私たちが必要とするすべての文が使用する場合の戻り値であるため)、それは静かに動作させ、それぞれの-e
パターンができるようにするパターンを指定します。
fgrep
正規表現マッチングではなく通常の文字列マッチングを行うgrepのバージョンです。あなたが持っている場合はgrep
、あなたが持っている必要がありfgrep
、そうでない場合、それが使用するのと同じだgrep
と-F
(あなたがちょうど代わるフラグfgrep -wq
と上記grep -Fwq
)。
shopt -s nocasematch
、大文字と小文字を区別せずに検索する場合に役立ちます。