web-dev-qa-db-ja.com

複数の正しい値と比較するbash文字列

私は次のbashscriptを持っています:

function get_cms {
    echo "input cms name"
    read cms
    cms=${cms,,}
    if [ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]; then
        get_cms
    fi
}

しかし、私が何を入力しても(正しい値と間違った値)、これらの3つの入力のうち1つだけを許可したいので、それは関数を再び呼び出しません。 ||で試しました[ var != value ] or [ var != value1 ] or [ var != value1 ]を使用しますが、何も機能しません。誰かが私を正しい方向に向けることができますか?

41
eagle00789

言う代わりに:

if [ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]; then

いう:

if [[ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]]; then

Conditional Constructs を参照することもできます。

37
devnull

主な目的が、指定された値がリストにないかどうかを確認することである場合、「equal tilde」演算子を介してBASHに組み込まれた拡張正規表現マッチングを使用できます( this answer も参照) :

if ! [[ "$cms" =~ ^(wordpress|meganto|typo3)$ ]]; then get_cms ; fi

ごきげんよう

60
Edgar Grill

そのようなリストにはcaseを使用する方が良いでしょう:

case "$cms" in
  wordpress|meganto|typo3)
    do_your_else_case
    ;;
  *)
    do_your_then_case
    ;;
esac

長いリストの場合、これは読みやすいと思います。

それでもifを好む場合は、次の2つの方法で単一の括弧でそれを行うことができます。

if [ "$cms" != wordpress -a "$cms" != meganto -a "$cms" != typo3 ]; then

または

if [ "$cms" != wordpress ] && [ "$cms" != meganto ] && [ "$cms" != typo3 ]; then
39
Alfe

これが私の解決策です

if [[ "${cms}" != +(wordpress|magento|typo3) ]]; then
2
Renich