bash:$ WORDが設定されているかどうかをテストします


54

bash変数$WORDが定義された単語の1つであるかどうかを判断するために、の構造を探しています。次のようなものが必要です。

if "$WORD" in dog cat horse ; then 
    echo yes
else
    echo no
fi

bashにはそのような構造がありますか?そうでない場合、最も近いものは何ですか?

回答:


57

これは、正規表現を使用する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する^$


1
またshopt -s nocasematch、大文字と小文字を区別せずに検索する場合に役立ちます。
スキッピー

1
[[]]- を使用する必要があり、十分[]はないことに注意してください。
グレッグドゥビッキー16

スクリプトの引数を検証するために「oneliner」を探していましたが、これは完全に機能しました。ありがとうございました![[ "$ARG" =~ ^(true|false)$ ]] || { echo "Argument received invalid value" ; exit 1 ; }
RASG


11

どうですか:

#!/usr/bin/env bash

WORD="$1"
for w in dog cat horse
do
  if [ "$w" == "$WORD" ] 
  then
      yes=1
      break
  fi
done;
[ "$yes" == "1" ] && echo "$WORD is in the list" || 
                     echo "$WORD is not in the list"

次に:

$ a.sh cat
cat is in the list
$ a.sh bob
bob is not in the list

3
if (echo "$set"  | fgrep -q "$WORD")

1
ただし、これ$WORDが空の場合はtrueを返し、WORD=caまたはWORD=ogまたは類似の場合に一致しますecho ${set[@]}
テルドン

ただ一部の単語を避けるためにはgrepする-wを追加
BrenoZan

1

これにはbash関数を定義できます。

function word_valid() 
{ 
  if [ "$1" != "cat" -a "$1" != "dog" -a "$1" != "horse" ];then
    echo no
  else
    echo yes
  fi
}

次に、次のように単純に使用します。

word_valid cat

1

私はスクリプトの引数を検証するために「1行」のソリューションを探していましたが、上記のJoseph R.の回答を使用して思い付きました:

[[ "$ARG" =~ ^(true|false)$ ]] || { echo "Argument received invalid value" ; exit 1 ; }


0

これは私のために働いた:

#!/bin/bash
phrase=(cat dog parrot cow horse)
findthis=parrot

for item in ${phrase[*]}
do
    test "$item" == "$findthis" && { echo "$findthis found!"; break; }
done

0

リストを頻繁に変更したり、複数のスクリプトで共有したりする場合に備えて、単語のリストをファイルに入れたい場合があります。また、リストがスクリプトで管理するには長すぎる場合は、単語をファイルに入れる必要があります。その後、あなたは言うことができます

if fgrep qx "$WORD" word_list

いいえ、私は、ファイル内の私のリストを持っている必要はありません
マーティンVegter

0

単語が値が改行で区切られたリストである場合、次のことができます。

WORDS="$(ls -1)"
if echo "${WORDS}" | grep --quiet --line-regexp --fixed-strings "${WORD}"; then
    echo yes
else
    echo no
fi

0

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)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.