[linux] BASH의 목록에 변수가 있는지 확인하는 방법

사용자 입력의 유효성을 확인하는 스크립트를 bash로 작성하려고합니다.
입력 (변수 x)을 유효한 값 목록 과 일치시키고 싶습니다 .

내가 지금 생각해 낸 것은 :

for item in $list
do
    if [ "$x" == "$item" ]; then
        echo "In the list"
        exit
    fi
done

내 질문은 더 간단한 방법이 있다면
list.contains(x) 대부분의 프로그래밍 언어
와 같은 것 입니다.

덧셈:
Say list is :

list="11 22 33"

내 코드는 list문자열이 아닌 배열로 취급 되므로 해당 값에 대해서만 메시지를 에코합니다 . 모든 문자열 조작은 유효성 1을 검사 하지만 실패 할 것입니다.



답변

[[ $list =~ (^|[[:space:]])$x($|[[:space:]]) ]] && echo 'yes' || echo 'no'

또는 함수를 작성하십시오.

contains() {
    [[ $1 =~ (^|[[:space:]])$2($|[[:space:]]) ]] && exit(0) || exit(1)
}

그것을 사용하려면 :

contains aList anItem
echo $? # 0: match, 1: failed


답변

Matvey는 옳지 만 $ x를 인용하고 모든 종류의 “공백”(예 : 줄 바꾸기)을 고려해야합니다.

[[ $list =~ (^|[[:space:]])"$x"($|[[:space:]]) ]] && echo 'yes' || echo 'no' 

그래서, 즉

# list_include_item "10 11 12" "2"
function list_include_item {
  local list="$1"
  local item="$2"
  if [[ $list =~ (^|[[:space:]])"$item"($|[[:space:]]) ]] ; then
    # yes, list include item
    result=0
  else
    result=1
  fi
  return $result
}

그런 다음 종료

`list_include_item "10 11 12" "12"`  && echo "yes" || echo "no"

또는

if `list_include_item "10 11 12" "1"` ; then
  echo "yes"
else
  echo "no"
fi

""변수의 경우에 사용해야 합니다.

`list_include_item "$my_list" "$my_item"`  && echo "yes" || echo "no"


답변

IMHO 가장 쉬운 해결책은 원래 문자열 앞에 공백을 추가하고 추가하여 정규 표현식을 확인하는 것입니다. [[ ]]

haystack='foo bar'
needle='bar'

if [[ " $haystack " =~ .*\ $needle\ .* ]]; then
    ...
fi

이것은 바늘을 서브 스트링으로 포함하는 값이있는 값 (예 : 건초 더미)에 대해서는 오 탐지가 아닙니다. foo barbaz .

(이 개념은 JQuery의 hasClass()-Method에서 뻔뻔스럽게 도난 당했습니다.)


답변

어때?

echo $list | grep -w $x

출력을 확인하거나 $? 위의 줄을 확인하여 결정을 내릴 수 있습니다.

grep -w 전체 단어 패턴을 확인합니다.


답변

이중 괄호를 사용하는 경우 case 문 외부에서 (* 와일드 카드)를 사용할 수도 있습니다.

string='My string';

if [[ $string == *My* ]]
then
echo "It's there!";
fi


답변

스크립트에서 값 목록을 하드 코딩해야하는 경우을 사용하여 테스트하는 것이 매우 간단합니다 case. 다음은 요구 사항에 적응할 수있는 간단한 예입니다.

for item in $list
do
    case "$x" in
      item1|item2)
        echo "In the list"
        ;;
      not_an_item)
        echo "Error" >&2
        exit 1
        ;;
    esac
done

런타임에 목록이 배열 변수이면 다른 답변 중 하나가 더 적합합니다.


답변

목록이 스크립트에 고정되어 있으면 다음이 가장 좋습니다.

validate() {
    grep -F -q -x "$1" <<EOF
item 1
item 2
item 3
EOF
}

그런 다음 허용 validate "$x"여부를 테스트 하는 데 사용하십시오 $x.

한 줄짜리를 원하고 항목 이름의 공백을 신경 쓰지 않으면 이것을 사용할 수 있습니다 ( -w대신에 통지 -x).

validate() { echo "11 22 33" | grep -F -q -w "$1"; }

노트:

  • 이것은 POSIX를 sh준수합니다.
  • validate하위 문자열을 허용 하지 않습니다 ( -x원하는 경우 grep 옵션을 제거하십시오 ).
  • validate인수를 정규식이 아닌 고정 문자열로 해석합니다 ( -F원하는 경우 grep 옵션을 제거하십시오 ).

기능을 수행하는 샘플 코드 :

for x in "item 1" "item2" "item 3" "3" "*"; do
    echo -n "'$x' is "
    validate "$x" && echo "valid" || echo "invalid"
done