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
및 $
.
댓글
답변
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 -wq
를 grep -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
기반 방법과 유사합니다.
shopt -s nocasematch
는 검색시 대소 문자를 구분하지 않으려는 경우 도움이 될 수 있습니다.[[
및–
[
및]
로는 충분하지 않습니다.[[ "$ARG" =~ ^(true|false)$ ]] || { echo "Argument received invalid value" ; exit 1 ; }
egrep -q "^$WORD$" /tmp/words; [[ $? != 0 ]] && echo "Not found" || echo "OK"
.