スペースを押して続行します

ユーザーがスペースを押すまでbashスクリプトを停止するにはどうすればよいですか?

スクリプトに質問があります

スペースを押して続行するか、 CTRL + C 終了する

その後、スクリプトを停止し、スペースが押されるまで待機する必要があります。

コメント

回答

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 

偉大な正義のために!

回答

怠惰な1つのライナー:

echo "Press any key to continue or Ctrl+C to cancel" read && do_something.sh 

欠点は、ユーザーがctrl + cを押すと制御が失われることです。その場合、スクリプトは常にコード130で終了します。

回答

空の文字列への設定IFSは、空白をトリミングする読み取りのデフォルトの動作を抑制します。

try_this() { echo -n "Press SPACE to continue or Ctrl+C to exit ... " while true; do # Set IFS to empty string so that read doesn"t trim # See http://mywiki.wooledge.org/BashFAQ/001#Trimming IFS= read -n1 -r key [[ $key == " " ]] && break done echo echo "Continuing ..." } try_this 

更新2018-05-23:単語分割の対象ではないREPLY変数を使用することで、これを簡略化できます:

try_this() { echo -n "Press SPACE to continue or Ctrl+C to exit ... " while true; do read -n1 -r [[ $REPLY == " " ]] && break done echo echo "Continuing ..." } try_this 

回答

ここに「からの簡単な解決策」を押して続行します(ENTERではありません)

read -s -d " " ープこれは、スペースバーを押すまで待機します。はい、スペースバーのみです。Enterキーを押しても壊れません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です