ユーザーがスペースを押すまでbashスクリプトを停止するにはどうすればよいですか?
スクリプトに質問があります
スペースを押して続行するか、 CTRL + C 終了する
その後、スクリプトを停止し、スペースが押されるまで待機する必要があります。
コメント
- このSOQ & A BTW: Linuxの同等物とはDOSで一時停止しますか?
- 関連項目: whileループでEnterキーを押すまでシェルスクリプトを一時停止します
- 関連: unix.stackexchange.com/questions/293940/ …
回答
read
を使用できます:
read -n1 -s -r -p $"Press space to continue...\n" key if [ "$key" = " " ]; then # Space pressed, do something # echo [$key] is empty when SPACE is pressed # uncomment to trace else # Anything else pressed, do whatever else. # echo [$key] not empty fi
上のスペースの" "
を
、タブキーの場合は$"\t"
。
コメント
- 押された文字を端末に出力しないようにするには、-sを追加する必要があります。最後に改行を追加します。そうしないと、質問のように同じ行に直接出力が続きます。最適な方法:
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
- このスクリプトは'機能しません。 Red HatLinuxでテストしたばかりです…スペースバーが押されている場合でも、
else
ブロックは常に実行されます。 - @robert It ' '
bash
を使用していないためです。代わりにread _
を使用し、bash
以外のシェルがある場合に機能します。 -
''
の中にスペースが含まれていますか? - これはSTDINから読み取られるため、
pipeline | script.sh
この回答による解決策。
回答
メソッドこのSOで説明されているQ & Aは、Windowsで慣れ親しんでいるpause
の動作に代わるものとして最適な候補です。 BATファイルを実行します。
$ read -rsp $"Press any key to continue...\n" -n1 key
例
ここでは、上記を実行してから、任意のキー(この場合は D キー。
$ read -rsp $"Press any key to continue...\n" -n1 key Press any key to continue... $
参照
コメント
- つまり、
$
befoここの文字列を再確認してください:-rsp $'Press
? - @ rubo77 – ああ。 'は、特殊文字を使用してリテラル文字列を作成する方法です。 'の形式:$ ' … '
- @ rubo77-その'は異なります。 'は二重引用符付きのドル記号ですが、私は一重引用符付きのドルを使用しました。そのコメントを削除してください'間違っています
- ああ、わかりました。エスケープされたシーケンスをプロンプト文字列内に配置した場合。 wiki.bash-hackers.org/syntax/quoting#ansi_c_like_strings
- @ rubo77を参照してください-はい、表記によりエスケープシーケンスを含めることができます余分な
echo -e "..."
行はありません。 'このような状況でははるかにコンパクトです。
回答
関数を作成できます:
pause(){ read -n1 -rsp $"Press any key to continue or Ctrl+C to exit...\n" }
これをスクリプトのどこでも使用できます:
pause
コメント
- シェルスクリプトを初めて使用する場合は、使用する前に関数をスクリプトの先頭に配置する必要があります
回答
hold=" " printf "Press "SPACE" to continue or "CTRL+C" to exit : " tty_state=$(stty -g) stty -icanon until [ -z "${hold#$in}" ] ; do in=$(dd bs=1 count=1 </dev/tty 2>/dev/null) done stty "$tty_state"
これで、末尾に改行がないプロンプトが出力されるようになりました。 CTRL+C
を確実に処理し、必要な頻度でstty
を呼び出し、制御ttyをが見つかりました。エコーを明示的に制御したり、文字を制御したりする方法については、man stty
を参照してください。
これを行うこともできます:
printf "Press any key to continue or "CTRL+C" to exit : " (tty_state=$(stty -g) stty -icanon LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1 stty "$tty_state" ) </dev/tty
ENTER
で実行できますが、[
テストはありません]
およびstty
のようなものはありません:
sed -n q </dev/tty
コメント
- 最後の2つの解決策は、bashだけでなく、
/bin/sh
(FreeBSDなど)でも問題なく機能するようです。 - は
- に対する答えです。 div id = “f1d73bcd88″>
SO と同等、またはそれ以上ですか?
回答
ここで「両方のbash
およびzsh
であり、端末へのI / Oを保証します:
# Prompt for a keypress to continue. Customise prompt with $* function pause { >/dev/tty printf "%s" "${*:-Press any key to continue... }" [[ $ZSH_VERSION ]] && read -krs # Use -u0 to read from STDIN [[ $BASH_VERSION ]] && </dev/tty read -rsn1 printf "\n" } export_function pause
偉大な正義のために!