나는 명령을 다시 실행해야 하는지 사용자에게 묻는 스크립트를 작성하려고 했습니다.
대답이 '예'이면 마지막 명령을 다시 실행해야 합니다. 두 번째 실행 후에도 마지막 명령을 실행해야 하는지 사용자에게 물어봐야 합니다. 나는 대답이 "아니요"가 될 때까지 이 일이 일어나기를 원하며, 대답이 "아니오"라면 종료되어야 합니다.
즉
$ cat shellscript.sh
echo foo
printf 'Can I run the last command (y/n)?'
내 대답이 '예'라면 "echo foo" 명령을 실행해야 합니다.
# after the 1st time execution
printf 'Can I run the last command again (y/n)?'
대답이 '예'이면 명령을 다시 실행하고 대답이 '예'가 될 때까지 동일한 작업(y/n을 묻고 수행)을 수행합니다. 그렇지 않은 경우 종료되어야 합니다.
일종의 루프를 구현해야 할 것 같은데 이것이 조건부 스크립트이기 때문에 혼란스럽습니다.
답변1
배시 사용:
while [[ "$REPLY" != "no" ]]
do
echo foo
read -p "Can I run the last command (yes/no)?"
done
루프를 종료하려면 문자 그대로 "아니요"라고 대답해야 하므로 "예/아니요" 프롬프트를 더 자세히 설명했습니다.
bash는 read
사용자 정의 프롬프트( -p
이후 및 문자열)를 허용하고 사용자의 응답을 $REPLY 변수에 저장합니다. 루프에 들어가기 전에는 "아니오"라고 생각하지 않습니다(아직 아무 것도 없으면 read
비어 있습니다).
답변2
대안제프의 대답:
while true; do
somecommand
while true; do
read -p 'Can I run the last command again (yes/no)? '
case "$REPLY" in
[Yy]*) break ;;
[Nn]*) break 2 ;;
*) echo 'Sorry, what?' >&2
esac
done
done
여기서 가장 큰 차이점은 사용자로부터 유효한 응답을 받아야 한다는 것입니다. 유효한 응답은 또는로 시작하는 문자열입니다 y
( n
대소문자 무시).
break
답변 읽기 루프 가 중단 되고 break 2
명령 루프도 중단됩니다.