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