ユーザーがスペースを押すまで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  
偉大な正義のために!