Bashに「q」と入力すると、読み込みを停止する方法は?

Bashに「q」と入力すると、読み込みを停止する方法は?

readいくつかのタスクを実行するためにユーザー入力を使用しています。セレクタは、ユーザーがENTER入力した後に押す必要なく適切な情報を印刷するために2文字のテストを使用します。q2文字のセレクタで構成されていないため、終了する値を許可できますか?

  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

読み取りを最初の読み取り(入力の最初に左)と2番目の文字の後続の読み取り(sumqと呼びます)に分割します。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が、ブロックの1つに必要になる可能性があるので、そのcaseままにしていました。 (単純化のために文字列同一性テストを$doneコマンドとして実行するように変更しました。)

関連情報