read
いくつかのタスクを実行するためにユーザー入力を使用しています。セレクタは、ユーザーがENTER
入力した後に押す必要なく適切な情報を印刷するために2文字のテストを使用します。q
2文字のセレクタで構成されていないため、終了する値を許可できますか?
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
と呼びます)に分割します。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
が、ブロックの1つに必要になる可能性があるので、そのcase
ままにしていました。 (単純化のために文字列同一性テストを$done
コマンドとして実行するように変更しました。)