단일 변수에 대한 값 집합을 정의하고 싶습니다. 예를 들어
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
, 10
not 참고) 를 사용합니다 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