bash : $ WORD가 설정되어 있는지 테스트


54

bash변수 $WORD가 정의 된 단어 중 하나 인지 여부를 결정하기 위해에서 구문을 찾고 있습니다. 나는 이와 같은 것이 필요하다 :

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

단어 목록이 길면 파일에 저장하고 (한 줄에 한 단어 씩) 다음을 수행하십시오.

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당신이 검색은 대소 문자를 구분하려는 경우 도움이 될 수 있습니다.
Skippy le Grand Gourou

1
당신이 사용한다는 점에 유의 [[하고 ]]- [그리고 ]충분하지 않습니다.
Greg Dubicki

스크립트 인수의 유효성을 검사하기 위해 '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또는 if WORD=og또는 이와 비슷한 경우 일치 하고 나는 당신이 의미한다고 가정합니다 echo ${set[@]}.
terdon

부분 단어를 피하기 위해 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

필자는 스크립트 인수를 확인하기 위해 '한 줄'솔루션을 찾고 있었고 위의 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

아니요, 파일에 내 목록을 갖고 싶지 않습니다
Martin 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.