Bash 스크립트의 두 입력 값이 올바른지 확인하는 방법은 무엇입니까?

Bash 스크립트의 두 입력 값이 올바른지 확인하는 방법은 무엇입니까?

저는 bash 스크립트를 작성 중이고 몇 가지 간단한 유효성 검사 테스트를 추가하고 싶습니다. 입력은 1또는 이어야 하며 2스크립트는 올바른 입력이 제공될 때까지 다시 입력을 요청해야 합니다.

루프를 사용하여 이 작업을 수행하려고 생각했지만 until작동하지 않습니다. 바인딩이 있지만 until [ $group -eq 1 ]( $group사용자가 지정한 값은 어디에 있습니까?) 분명히 두 번째 입력도 필요합니다. 어떻게 하면 올바르게 할 수 있나요?

답변1

until
  printf 'Please enter 1 or 2: '
  IFS= read -r line || exit # exit on EOF
  [ "$line" = 1 ] || [ "$line" = 2 ]
do
  printf >&2 '"%s" is neither 1 nor 2, try again.\n' "$line"
done

IFS=및 를 사용하면 -r입력 행이 그대로 에 저장됩니다 $line. 공백이 입력의 시작이나 끝에서 자동으로 제거되도록 생략할 수 있습니다 IFS=(수정하지 않았다고 가정).$IFS

입력이 1또는 문자열만 될 수 있는 경우 대신 을 2사용해야 합니다 .=-eq

다른 표현을 허용하고 싶 1거나2 숫자, 예를 들어 01, 1+1, 1.0, 100e-2, (때때로) 를 사용할 수 있지만 exp(0)모든 쉘이 위의 모든 유형의 표현식을 허용하는 것은 아닙니다( 모든 유형이 허용되지만 (선행 및/또는 후행 공백 과 같은 유형만 허용됨) ) 클래스의 내용 또는 (선행 0)), 이는 입력이 유효한 산술 표현식을 형성하지 않는다는 오류 메시지를 받게 됨을 의미합니다.RANDOM-eqksh93bash10001

이는 산술 표현식을 해석하는 쉘에도 위험합니다. 변수 값을 변경하거나(예: 와 같은 입력의 경우 PATH=123) 임의의 명령을 실행할 수도 있기 때문입니다(예: 와 같은 입력의 경우 a[0$(cmd>&2)]).

셸에 따라 대부분의 셸이 64비트 또는 32비트 정수를 사용하므로 18446744073709551617 또는 4294967297(또는 2 32 또는 2 64 + 1 또는 기타 2의 배수)에서 거짓 긍정을 얻을 수도 있습니다.

뭘 하든 그냥 해아니요-oand -a바이너리 test/ 연산자를 사용하세요 [. 추방되어야 할 사람들[실제로 는 명령 구문 분석을 잠재적으로 모호하고 신뢰할 수 없게 만듭니다 (현재는 다음과 같이 표시됨).쓸모없는POSIX 사양에서).

예를 들어:

$ line='!' sh -c '[ "$line" = 1 -o "$line" = 2 ]'
sh: line 0: [: too many arguments

그리고 변수를 인용하는 것을 기억하십시오( split+glob이 될 변수가 "$line"아님 ).$line

답변2

-o다음 과 같이 또는 ( )와 결합하면 작동합니다 .

#init group variable
group=0
#read until value is either 1 or 2
until [ $group -eq 1 -o $group -eq 2 ]; 
    do 
    #your script...

    #read user input and put it in group
    read -p "Which group?" group 
done

||as 또는 연산자를 사용할 수도 있습니다 .

until [ $group -eq 1 ] || [ $group -eq 2 ]

오류 코드( )를 사용하는 경우와 같은 경우에는 $?첫 번째 옵션이 더 낫습니다.이 답변.

답변3

while IFS= read -r; do
    case "$REPLY" in
        1|2) break ;;
        *)   echo 'Error' >&2 ;;
    esac
done

이 코드 조각은 표준 입력에서 값을 읽은 다음 1및 에 대해 테스트합니다 2. 두 문자열 중 하나가 일치하면 루프가 종료되고, 그렇지 않으면 간결한 진단 메시지가 생성되고 루프가 계속됩니다.

답변4

다음을 사용하여 표현식에 두 번째 조건을 추가하면 됩니다.또는운영자 -o.

관련 정보