![Bash에 "q"를 입력하면 읽기를 중지하는 방법은 무엇입니까?](https://linux55.com/image/216256/Bash%EC%97%90%20%22q%22%EB%A5%BC%20%EC%9E%85%EB%A0%A5%ED%95%98%EB%A9%B4%20%EC%9D%BD%EA%B8%B0%EB%A5%BC%20%EC%A4%91%EC%A7%80%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
read
일부 작업을 수행하기 위해 사용자 입력을 사용하고 있습니다 . 선택기는 사용자가 ENTER
입력한 후 누를 필요 없이 적절한 정보를 인쇄하기 위해 두 문자 테스트를 사용합니다 . q
두 문자 선택기로 구성되지 않기 때문에 종료할 값을 허용할 수 있습니까 ?
local done="false"
while [ "$done" != "true" ]
do
echo ; read -n 2 lsk
case $lsk in
"1L")
echo "$navaid_vscal"
echo -e "$tacrgm"
;;
q)
done="true" # ends while loop
echo -n "$sgr"
;;
*)
## repeats while do
;;
esac
done
답변1
read
나는 내장된 bash에 이 기능이 있다고 믿지 않습니다 . 그러나 사용자 정의 읽기를 구현할 수 있습니다주문하다또는기능이를 달성하기 위해.
예를 들어 다음 기능을 사용할 수 있습니다.
read_or_quit(){
x=0;
while ((++x<=2)); do
read -n 1
if [[ $REPLY = q ]]; then
echo q
break
else
echo -n "$REPLY"
fi
done ;
echo
# I thought that printing `echo` to `stdout` would
# append a new line which might break the `case`
# functionality.
# echo >&2
}
$(read_or_quit)
다음을 사용하여 코드에서 이 함수를 호출 할 수 있습니다 .
local done="false"
while [ "$done" != "true" ]
do
lsk=$(read_or_quit)
case $lsk in
"1L")
echo "$navaid_vscal"
echo -e "$tacrgm"
;;
q)
done="true" # ends while loop
echo -n "$sgr"
;;
*)
## repeats while do
;;
esac
done
답변2
읽기를 초기 읽기( 입력 초기에 왼쪽)와 두 번째 문자의 후속 읽기( sum q
이라고 부르겠습니다 )로 나눕니다.ch1
ch2
local done=false
until "$done"
do
echo
read -n 1 ch1
if [ ch1 = q ]
then
printf %s "$sgr" # More portable than echo -n
break
fi
read -n 1 ch2
case "$ch1$ch2" in
1L)
echo "$navaid_vscal"
echo -e "$tacrgm" # portability problem here!
;;
*)
## repeats while do
;;
esac
done
분명히 루프는 while true
지금 설정되지 않았기 때문에 가능 done
하지만 블록 중 하나에 필요할 수도 있으므로 case
그대로 두었습니다. (단순화를 위해 문자열 동일성 테스트를 $done
명령으로 실행 하도록 변경했습니다 .)