저는 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
-eq
ksh93
bash
1
0001
이는 산술 표현식을 해석하는 쉘에도 위험합니다. 변수 값을 변경하거나(예: 와 같은 입력의 경우 PATH=123
) 임의의 명령을 실행할 수도 있기 때문입니다(예: 와 같은 입력의 경우 a[0$(cmd>&2)]
).
셸에 따라 대부분의 셸이 64비트 또는 32비트 정수를 사용하므로 18446744073709551617 또는 4294967297(또는 2 32 또는 2 64 + 1 또는 기타 2의 배수)에서 거짓 긍정을 얻을 수도 있습니다.
뭘 하든 그냥 해아니요-o
and -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
.