Bash에 "q"를 입력하면 읽기를 중지하는 방법은 무엇입니까?

Bash에 "q"를 입력하면 읽기를 중지하는 방법은 무엇입니까?

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이라고 부르겠습니다 )로 나눕니다.ch1ch2

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명령으로 실행 하도록 변경했습니다 .)

관련 정보