Bagaimana cara menghentikan skrip bash hingga pengguna menekan Space?
Saya ingin memiliki pertanyaan dalam skrip saya
Tekan spasi untuk melanjutkan atau CTRL+ Cuntuk keluar
dan kemudian skrip harus berhenti dan menunggu sampai Space ditekan.
Bagaimana cara menghentikan skrip bash hingga pengguna menekan Space?
Saya ingin memiliki pertanyaan dalam skrip saya
Tekan spasi untuk melanjutkan atau CTRL+ Cuntuk keluar
dan kemudian skrip harus berhenti dan menunggu sampai Space ditekan.
Jawaban:
Anda bisa menggunakan 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
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
else
Blok selalu berjalan, bahkan ketika bilah spasi ditekan.
bash
. Ini berfungsi jika Anda menggunakannya read _
sebagai gantinya, jika Anda memiliki beberapa shell selain bash
.
''
mengandung ruang di dalam?
''
untuk string kosong. Tidak ada ruang di dalam. Saya kira, itu juga cocok, jika Anda memasukkan ENTER atau TAB
Metode yang dibahas dalam T&J SO ini kemungkinan merupakan kandidat terbaik untuk alternatif pause
perilaku yang biasa Anda lakukan di Windows saat melakukan file BAT.
$ read -rsp $'Press any key to continue...\n' -n1 key
Di sini saya menjalankan di atas dan kemudian cukup menekan tombol apa saja, dalam hal ini Dkuncinya.
$ read -rsp $'Press any key to continue...\n' -n1 key
Press any key to continue...
$
$
sebelum string di sini -rsp $'Press
:?
echo -e "..."
garis tambahan . Jauh lebih ringkas dalam situasi itu.
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"
Ini sekarang mencetak prompt tanpa baris baru, menangani dengan CTRL+C
andal, stty
hanya memanggil sesering yang diperlukan, dan mengembalikan tty mengendalikan ke keadaan di mana stty
menemukannya. Cari man stty
informasi tentang cara mengontrol gema, mengontrol karakter, dan semuanya secara eksplisit.
Anda mungkin juga melakukan ini:
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
Anda dapat melakukannya dengan ENTER
, tanpa [
tes ]
dan tanpa stty
suka:
sed -n q </dev/tty
Anda dapat membuat fungsi untuk itu:
pause(){
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
}
Maka Anda dapat menggunakan ini di mana saja dalam skrip Anda:
pause
Pengaturan IFS
untuk mengosongkan string akan menekan perilaku default baca dari pemotongan ruang putih.
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
UPDATE 2018-05-23: Kita dapat menyederhanakan ini dengan menggunakan variabel REPLY, yang tidak tunduk pada pemisahan kata:
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
Inilah cara yang bekerja di keduanya bash
dan zsh
, dan memastikan I / O ke terminal:
# 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
Taruh di dalam Anda .{ba,z}shrc
untuk Keadilan Hebat!