Bash에서 여러 옵션(문자열) 비교

Bash에서 여러 옵션(문자열) 비교

read명령을 사용할 때 특정 옵션만 활성화하고 오타 가능성이 있는 경우 스크립트를 종료하려고 합니다 .

많은 가능성(배열, 변수, 구문 변경)을 시도했지만 여전히 초기 문제에 봉착했습니다.

사용자 입력을 테스트하고 나머지 스크립트 실행을 허용\비활성화하려면 어떻게 해야 합니까?

#!/bin/bash

red=$(tput setaf 1)
textreset=$(tput sgr0) 

echo -n 'Please enter requested region > '
echo 'us-east-1, us-west-2, us-west-1, eu-central-1, ap-southeast-1, ap-northeast-1, ap-southeast-2, ap-northeast-2, ap-south-1, sa-east-1'
read text

if [ -n $text ] && [ "$text" != 'us-east-1' -o us-west-2 -o us-west-1 -o eu-central-1 -o ap-southeast-1 -o ap-northeast-1 -o ap-southeast-2 -o  ap-northeast-2 -o ap-south-1 -o sa-east-1 ] ; then 

echo 'Please enter the region name in its correct form, as describe above'

else

echo "you have chosen ${red} $text ${textreset} region."
AWS_REGION=$text

echo $AWS_REGION

fi

답변1

사용자에게 영역 이름을 입력하도록 요구하여 사용자의 생활을 좀 더 쉽게 만들어 보는 것은 어떨까요?

#!/bin/bash

echo "Select region"

PS3="region (1-10): "

select region in "us-east-1" "us-west-2" "us-west-1" "eu-central-1" \
    "ap-southeast-1" "ap-northeast-1" "ap-southeast-2" \
    "ap-northeast-2" "ap-south-1" "sa-east-1"
do
    if [[ -z $region ]]; then
        printf 'Invalid choice: "%s"\n' "$REPLY" >&2
    else
        break
    fi
done

printf 'You have chosen the "%s" region\n' "$region"

사용자가 목록에 유효한 숫자 옵션이 아닌 항목을 입력하면 해당 값은 $region빈 문자열이 되고 오류 메시지가 표시됩니다. 선택이 유효하면 루프가 종료됩니다.

실행하세요:

$ bash script.sh
Select region
1) us-east-1         4) eu-central-1     7) ap-southeast-2  10) sa-east-1
2) us-west-2         5) ap-southeast-1   8) ap-northeast-2
3) us-west-1         6) ap-northeast-1   9) ap-south-1
region (1-10): aoeu
Invalid choice: "aoeu"
region (1-10): .
Invalid choice: "."
region (1-10): -1
Invalid choice: "-1"
region (1-10): 0
Invalid choice: "0"
region (1-10): '
Invalid choice: "'"
region (1-10): 5
You have chosen the "ap-southeast-1" region

답변2

사례를 사용하지 않는 이유는 무엇입니까?

case $text in 
  us-east-1|us-west-2|us-west-1|eu-central-1|ap-southeast-1|etc) 
         echo "Working"
  ;;

  *)
         echo "Invalid option: $text"
  ;;
esac 

답변3

문제는 이것이다:

[ "$text" != 'us-east-1' -o us-west-2 -o ... ]

-o방법또는완전한 조건이 필요하므로

[ "$text" != 'us-east-1' -o "$text" != 'us-west-2' -o ... ]

$text매번 테스트를 해야 합니까?

당신의논리당신이 원하는 것도 틀렸어요 -a(그리고); "us-east-1"이 아닌 경우그리고이것은 "us-west-2"가 아닙니다.그리고그것은 아니다...

그래서

[ "$text" != 'us-east-1' -a "$text" != 'us-west-2' -a ... ]

이러한 유형의 테스트를 수행하는 다른 방법이 있습니다. 그 중 일부는 단순히 "개인 취향"입니다. 그러나 이 구문은 앞으로 나아가고 원래 구문의 형식과 구조를 따르는 데 도움이 됩니다.

답변4

다음을 수행할 수 있습니다.

valid=(foo bar doo)
echo enter something, valid values: "${valid[@]}"
read text
ok=0
for x in "${valid[@]}" ; do 
    if [ "$text" = "$x" ] ; then ok=1 ; fi ; 
done 
echo is it ok: $ok

유효한 값은 입력 문자열을 표시하고 테스트하는 데 사용할 수 있는 bash 배열에 저장됩니다.

-o완전한 조건이 필요하다는 사실 외에도 test사용해서는 안 되는 몇 가지 주장이 있습니다.

[ "$x" != "foo" -a "$x" != "bar" ] 

하지만 대신

[ "$x" != "foo" ] && [ "$x" != "bar" ] 

관련 정보