제가 당황한 것 같은 몇 가지 질문이 있습니다. 이것은 Bash의 논리를 따르는 것 같습니다.
if [ "$argument" = "Y" -o "$argument" = "YES" ];
then
…
fi
이 문을 두 번 사용하지 않고 만들 수 있는 방법이 있나요 "$argument"
? 예, 알았어와 같은 답변을 3~4개 추가하려면 어떻게 이것을 확장할 수 있나요?
두번째,
while [ "$argument" != "Y" ] || [ "$argument" != "YES" ] || [ "$argument" != "N" ] || [ "$argument" != "NO" ]; do
echo "Not a valid selection"
done
여기서 내가 무엇을 잘못하고 있는지 잘 모르겠지만 어떤 문을 입력하더라도 $argument
항상 Not a valid selection
Y, YES, N 또는 NO를 허용하지 않는다는 메시지를 받습니다.
답변1
귀하의 예에서는 항상 대답이 유효하지 않다고 표시됩니다. 이는 귀하가 작성한 논리가 작동하는 실제 예가 없기 때문입니다. 그 가치가 무엇 이든 간에 $argument
그럴 것이다.언제나Y
은(는 ) 또는 와 같지 않습니다 YES
. 마치 이 값 중 하나인 것처럼할 수 없다다른 사람이 되십시오.
다음 내용을 검토해 보세요 case
.
valid=0
while [[ valid -eq 0 ]]; do
read -p 'Really? > ' argument
case "$argument" in
Y*|y*)
valid=1
: handle 'yes' cases
;;
N*|n*)
valid=1
: handle 'no' cases
;;
*)
printf 'Invalid input "%s". Please say "yes" or "no".\n' "$argument" 1>&2
;;
esac
done
답변2
if [ "$argument" = "Y" -o "$argument" = "YES" ]; then
"$argument"를 두 번 사용하지 않고 이 문을 생성하는 방법이 있나요?
표준 쉘에는 다음이 있습니다 case
.
case $argument in
Y|YES) echo "it's 'Y' or 'YES'";;
*) echo "it's something else";;
esac
Bash/Ksh/Zsh에서는 정규식을 사용합니다.
if [[ $argument =~ Y|YES ]]; then
...
Bash/Ksh(또는 가 있는 Zsh setopt kshglob
)에서는 Ksh 스타일 확장 글로브를 사용합니다.
if [[ $argument = @(Y|YES) ]]; then
...
물론 regex ^Y(ES)?$
또는 또는 (포함 ) 로 시작하는 항목 ^[yY]
과 일치하는 등 다양한 다른 옵션이 있습니다.y
Y
yuck, no!
while [ "$argument" != "Y" ] || [ "$argument" != "YES" ] ...
내가 여기서 뭘 잘못하고 있는지 잘 모르겠습니다.
이 경우 논리를 수동으로 완료하는 것이 도움이 될 수 있습니다. argument
yes라고 가정 Y
하면 [ "$argument" != "Y" ]
거짓이고 [ "$argument" != "YES" ]
참이므로 결과는 다음과 같습니다.또는그건 진실이야. 다른 값에 대해서도 이를 반복하면 비교 중 적어도 하나가 항상 참임을 알 수 있습니다.