"stringA" 또는 "stringB"와 같은지 사용자 입력을 확인하고 이 문자열 중 하나와 같은 경우 사용자 입력을 인쇄해야 하는 스크립트를 bash에 작성하고 싶습니다. 내 코드는 다음과 같습니다
#!/bin/bash
echo "Please enter your choice (stringA or stringB): "
read result
while [[ (${result,,} != 'stringa') || (${result,,} != 'stringb') ]]; do
echo Please enter only stringA or stringB:
read result
done
echo "You have selected $result!"
exit
불행하게도 이 코드는 작동하지 않고 무한 반복됩니다. the 가 while 루프의 두 번째 부분을 $result
제거하는 문자열 중 하나와 같은 경우에만 비교할 수 있습니다 . 을(를) ||
대체하려고 했지만 다음 오류가 발생했습니다.||
-o
./chk.sh: line 12: syntax error in conditional expression
./chk.sh: line 12: syntax error near `-o'
./chk.sh: line 12: `while [[ (${result,,} != 'stringa') -o (${result,,} != 'stringb') ]]; do'
답변1
&&
가 아닌 을 사용하고 싶기 때문입니다 ||
.
결과가 stringA가 아니고 stringB도 아닌 경우 루프를 반복하려고 합니다. 어떤 문자열도 두 문자열과 같을 수 없으며 이로 인해 루프가 종료됩니다.
다음에서 패턴을 사용할 수도 있습니다 [[ ... ]]
.
while [[ ${result,,} != string[ab] ]]
답변2
#!/bin/bash
echo "Please enter your choice (stringA or stringB): "
read result
while ! [ "${result,,}" = 'stringa' -o "${result,,}" = 'stringb' ]; do
echo Please enter only stringA or stringB:
read result
done
echo "You have selected $result!"
exit
텍스트 음성에서 결과가 아닌 경우 stringa이거나 결과가 stringb do...
"
변수 주변 에 주의하세요 . 그렇지 않으면 var가 $result
비어 있으면 오류가 발생합니다.
답변3
코드의 문제는 루프가 반복되는 것입니다.$result
와 동일하지 않다는 것입니다.둘 다 stringA
그리고 stringB
(동시에). 당신은 사용하고 싶을 수도 있습니다
while [[ "${result,,}" != 'stringa' ]] && [[ "${result,,}" != 'stringb') ]]
또는
until [[ "${result,,}" == 'stringa' ]] || [[ "${result,,}" == 'stringb') ]]
사용자가 몇 가지 선택 사항 중 하나를 선택하도록 하려면 긴 문자열을 입력하도록 하지 마십시오. 대신 선택할 수 있는 간단한 메뉴를 제공하세요.
제안:
#!/bin/bash
PS3='Your choice: '
select result in 'stringA' 'stringB'; do
case $REPLY in
[12])
break
;;
*)
echo 'Invalid choice' >&2
esac
done
printf 'You picked %s!\n' "$result"
이것을 실행하면:
$ bash script.sh
1) stringA
2) stringB
Your choice: 3
Invalid choice
Your choice: 2
You picked stringB!
답변4
변형 이며 로케일을 사용하여 문자열을 변환하는 것과 sh
관련된 문제를 제거합니다 ( 예를 들어 소문자는 모든 사람에게 해당 되지 않습니다 ).${var,,}
I
i
#! /bin/sh -
while true; do
printf %s "Please enter your choice (stringA or stringB): "
IFS= read -r result || exit # exit on EOF
case $result in
([sS][tT][rR][iI][nN][gG][aAbB]) break
esac
echo >&2 Invalid choice.
done