쉘 스크립트의 변수 값 세트 정의

쉘 스크립트의 변수 값 세트 정의

단일 변수에 대한 값 집합을 정의하고 싶습니다. 예를 들어

singleDigit={0,1,2,3,4,5,6,7,8,9}

사용자가 10을 입력하면 오류와 함께 종료됩니다.

루프를 사용하지 않고 배열을 사용하여 이를 어떻게 달성할 수 있습니까?

답변1

여러 값을 하나의 변수에 저장하려면 다음을 사용할 수 있습니다.대량으로좋다:

allowed_values=(0 1 2 3 4 5 6 7 8 9)

또는

allowed_values=({0..9})

with bash3+(지금부터 차용한 구문은 zsh에서도 사용할 수 있습니다 ksh93).

주어진 문자열이 이러한 값 중에 있는지 확인하려면 다음과 같은 함수를 정의할 수 있습니다.

isin() {
  local s
  for s in "${@:2}"; do
    [[ $1 = "$s" ]] && return 0
  done
  return 1
}

if isin "$input" "${allowed_values[@]}"

( 에서는 zsh이 작업을 수행할 수 있습니다 if ((allowed_values[(eI)$input]))).

비교는 어휘적입니다(예: 01 != 1). 수치 비교를 수행하려면 [ "$1" -eq "$s" ] 2> /dev/null( yes 010, 10not 참고) 를 사용합니다 8. [[ $1 -eq $s ]]또는 ((s == $1))임의의 명령 주입 취약점을 도입하므로 사용하지 마십시오 .


할당하고 싶다면무늬특정 입력과 일치시키려는 변수의 경우 스칼라 변수를 사용하고 extglob지원되는 다음 2개(옵션 포함 3개) 패턴 구문 중 하나를 사용할 수 있습니다 bash.

  • 와일드카드/전역 패턴

    pattern='[0-9]'
    

    다음과 같이 사용됩니다:

    case $input in
      ($pattern) echo OK;;
      (*) echo NOK
    esac
    

    또는

    if [[ $input = $pattern ]]; then
      echo OK
    else
      echo NOK
    fi
    
  • 확장 정규식:

    regex='^[0-9]$'
    

    다음과 같이 사용됩니다:

    if [[ $input =~ $regex ]]; then
      echo OK
    else
      echo NOK
    fi
    

일반적으로 단일 문자가 아닌 값의 경우 다음을 사용할 수 있습니다.

regex='^(one|two|three)$'

그리고모델, 다음 extglob옵션이 필요합니다.

shopt -s extglob
pattern='@(one|two|three)'

bash4+, 또는 또는 를 사용하는 ksh93또 다른 방법 zsh은 연관 배열을 사용하는 것입니다.

그리고 bash, ksh93:

typeset -A allowed_values
allowed_values=([one]=1 [two]=1 [three]=1)
if ((allowed_values[$input])); then
  echo OK
else
  echo NOK
fi

에서도 zsh동일하지만 할당 구문은 다음과 같습니다.

typeset -A allowed_values
allowed_values=(one 1 two 1 three 1)

(사용 시 bash빈 문자열은 허용되는 값이 될 수 없습니다.)

답변2

0부터 9까지의 숫자만 허용되는 경우 간단한 IF 문만 있으면 됩니다.

#!/bin/bash

echo -n Please enter a single digit:
read single_digit
if [ $single_digit -lt 10 ]; then
   echo Thanks for $single_digit
else
   echo Screwball!!! I said SINGLE DIGIT!!
fi

관련 정보