bash : $ WORD가 세트에 있는지 테스트

bash에서 구문을 찾고 있는지 확인합니다. 변수 $WORD는 정의 된 단어 중 하나입니다. 다음과 같은 것이 필요합니다.

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

bash에 이러한 구조가 있습니까? 그렇지 않은 경우 가장 가까운 것은 무엇입니까?

답변

이것은 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 

$.

댓글

  • shopt -s nocasematch는 검색시 대소 문자를 구분하지 않으려는 경우 도움이 될 수 있습니다.
  • [[

[]로는 충분하지 않습니다.

  • 검색 중이었습니다. ' oneliner '가 내 스크립트 인수의 유효성을 검사하기 위해 완벽하게 작동했습니다. 감사합니다! [[ "$ARG" =~ ^(true|false)$ ]] || { echo "Argument received invalid value" ; exit 1 ; }
  • ' 일치하는 목록을 파일에 넣으려면 다음을 사용하는 것이 좋습니다. grep : egrep -q "^$WORD$" /tmp/words; [[ $? != 0 ]] && echo "Not found" || echo "OK".
  • 답변

    case $word in dog|cat|horse) echo yes;; *) echo no;; esac 

    답변

    방법 :

    #!/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 

    답변

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

    댓글

    • 하지만 $WORD가 비어 있으면 true를 반환하고 WORD=ca 또는 WORD=og 또는 이와 유사하며 echo ${set[@]}을 의미한다고 가정합니다.
    • 추가 -w to grep to grep to avoid partial words

    Answer

    다음과 같이 bash 함수를 정의 할 수 있습니다.

    p>

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

    그런 다음 다음과 같이 사용하십시오.

    word_valid cat 

    답변

    스크립트 인수를 확인하기 위해 “한 줄”솔루션을 찾고 있었고 위의 Joseph R. answer 를 사용했습니다. 최대 :

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

    답변

    나 fgrep를 사용하여 허용 된 모든 단어를 지정할 수 있습니다.

    if $(echo "$WORD" | fgrep -wq -e dog -e cat -e horse) ; then echo yes else echo no fi 

    -w 플래그는 전체 단어와 일치합니다. -q 플래그를 사용하면 자동으로 작동하고 (필요한 것은 if 문에 사용할 반환 값만 있기 때문입니다) 각 -e 패턴은 패턴을 지정합니다. 허용합니다.

    fgrep는 정규식 일치 대신 일반 문자열 일치를 수행하는 grep 버전입니다. grep가있는 경우 fgrep가 있어야하지만 그렇지 않은 경우 grep-F 플래그로 지정합니다 (따라서 위의 fgrep -wqgrep -Fwq).

    답변

    저에게 효과적이었습니다.

    #!/bin/bash phrase=(cat dog parrot cow horse) findthis=parrot for item in ${phrase[*]} do test "$item" == "$findthis" && { echo "$findthis found!"; break; } done 

    답변

    목록을 자주 변경하거나 원하는 경우 파일에 단어 목록을 넣을 수 있습니다. 여러 스크립트에서 공유 할 수 있습니다. 목록이 너무 길어 스크립트에서 관리 할 수없는 경우 단어를 파일에 넣어야 할 수 있습니다. 그런 다음

    if fgrep –qx "$WORD" word_list 

    댓글

    • 아니요. ' 파일에 내 목록을 포함하고 싶지 않습니다.

    답변

    단어가 줄 바꿈으로 값이 구분되는 목록 인 경우 다음을 수행 할 수 있습니다.

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

    답변

    방금 같은 문제가 발생하여 정규식 지식이 필요하지 않은 놀랍도록 이해할 수있는 솔루션을 찾았습니다.

    아래에 표시된 솔루션은 bash와 다른 쉘의 차이점에 대한 단서가 없기 때문에 bash 전용 일 수 있습니다. 또한 bash 매뉴얼은 일치해야하는 문자열이 길면 이런 종류의 패턴 일치가 느리다고 경고합니다.

    WORD=abc [[ "$WORD" == @(def|abc|ghi|foo|barbaz) ]] && echo Word is in set. 

    어떻게 작동합니까?여기서 bash 매뉴얼의 많은 부분을 반복하고 싶지는 않지만 내 말로 표현하면 다음과 같습니다.

    복합 명령과 함께 이항 연산자 ==를 사용하는 경우 [[, 연산자의 오른쪽에있는 단어는 " 패턴 일치 . 또한 이러한 조건에서 일치하는 동안 쉘 옵션 extglob가 설정된 것으로 가정합니다 (실제 설정에 관계없이). 위의 내용을 이해하는 데 핵심 포인트입니다.

    하지만 세트의 단어에 패턴 일치, 명령 대체 및 기타 확장에서 특별한 의미를 가진 문자가 이미 포함되어있는 경우 해결 방법은 간단합니다. 다음과 같은 것을 사용하면됩니다.

    [[ "$WORD" == @("a*"|abc|"?ghi"|"$DontExpandMe"|barbaz) ]] && echo Word is in set. 

    $WORD가 짧으면 매우 쉽고 이해하기 쉬우 며 효율적이라는 것을 알았습니다. 부작용이 없거나 다인 솔루션 set 기반 방법과 유사합니다.

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다