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


73

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

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

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

次に、スクリプトが停止し、Spaceが押されるまで待機します。


これ以上のことはすべてこのSO Q&Aで対処されていますところで、DOSの一時停止に相当するLinuxとは何ですか?
slm


回答:


58

以下を使用できますread

read -n1 -r -p "Press space to continue..." 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

12
押した文字を端末に出力しないように-sを追加する必要があります。最後に改行を追加します。そうしないと、質問と同じ行で出力が直接続行されます。ベスト:read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
rubo77 14年

1
このスクリプトは機能しません。Red Hat linuxでテストしました... elseスペースバーが押されていても、ブロックは常に実行されます。
ロバート

3
@robertを使用しないからですbashread _以外のシェルを使用している場合、代わりに使用すると機能しますbash
ニクラスローゼンクランツ

''内部にスペースを含める必要がありますか?
ホセアントニオデュラオルモス

これは''空の文字列用です。内部にスペースはありません。ENTERまたはTABを入力した場合も適合すると思います
-rubo77

44

このSO Q&Aで説明されている方法は、pauseBATファイルを実行する際にWindowsで慣れている動作の代替手段の候補として最適です。

$ 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...
$ 

参照資料


私はなぜ$ここの文字列の前にあるの-rsp $'Pressですか?
rubo77 14年

2
@ rubo77-ああ。これが、特殊文字を使用したリテラル文字列の実行方法です。次の形式です:$ '...'
slm

1
@ rubo77-それは違います。それは二重引用符付きのドル記号です。単一引用符付きのドル記号を使用しました。そのコメントを削除してください、それは間違っています。
slm

1
ああ、わかりました。エスケープ文字列をプロンプト文字列内に配置する場合。参照wiki.bash-hackers.org/syntax/quoting#ansi_c_like_strings
rubo77

@ rubo77-はい。表記法により、エスケープシーケンスを余分なecho -e "..."行なしで含めることができます。そのような状況では、はるかにコンパクトです。
slm

6
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がstty見つかった状態に正確に復元されます。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

5

あなたはそれのための関数を作成することができます:

pause(){
 read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
}

次に、スクリプトのどこでもこれを使用できます。

pause

あなたはシェルスクリプトに新しいしている場合-あなたはそれを使用する前に、あなたのスクリプトの先頭に機能を配置する必要があります
リチャード

3

レイジーワンライナー:

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

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


2

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

1

ここの両方で動作する方法だbashzsh、端末に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

.{ba,z}shrc大正義のためにそれを入れてください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.