ฉันจะหยุดสคริปต์ทุบตีจนกว่าผู้ใช้จะกดได้Spaceอย่างไร
ฉันต้องการมีคำถามในสคริปต์ของฉัน
กด space เพื่อดำเนินการต่อหรือCTRL+ Cเพื่อออก
จากนั้นสคริปต์ควรหยุดและรอจนกว่าจะกด Space
ฉันจะหยุดสคริปต์ทุบตีจนกว่าผู้ใช้จะกดได้Spaceอย่างไร
ฉันต้องการมีคำถามในสคริปต์ของฉัน
กด space เพื่อดำเนินการต่อหรือCTRL+ Cเพื่อออก
จากนั้นสคริปต์ควรหยุดและรอจนกว่าจะกด Space
คำตอบ:
คุณสามารถใช้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
บล็อกจะทำงานอยู่เสมอแม้ว่าจะกด spacebar ก็ตาม
bash
มันเป็นเพราะคุณไม่ได้ใช้ มันทำงานได้ถ้าคุณใช้แทนถ้าคุณมีบางเปลือกอื่นที่ไม่ใช่read _
bash
''
มีช่องว่างภายในหรือไม่
''
สตริงว่าง ไม่มีพื้นที่ภายใน ฉันเดาว่ามันพอดีถ้าคุณป้อน ENTER หรือ TAB
วิธีการที่กล่าวถึงในคำถามและคำตอบ SO นี้น่าจะเป็นตัวเลือกที่ดีที่สุดสำหรับทางเลือกในpause
พฤติกรรมที่คุณคุ้นเคยกับการใช้งาน Windows เมื่อทำไฟล์ 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...
$
$
ก่อนสตริงในที่นี่: -rsp $'Press
?
echo -e "..."
บรรทัดเพิ่มเติมใด ๆ มันกะทัดรัดกว่าในสถานการณ์เหล่านั้น
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
ข้อมูลเกี่ยวกับวิธีควบคุม echoes อักขระควบคุมและทั้งหมดอย่างชัดเจน
คุณอาจทำสิ่งนี้:
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
คุณสามารถสร้างฟังก์ชั่นได้:
pause(){
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
}
จากนั้นคุณสามารถใช้สิ่งนี้ได้ทุกที่ในสคริปต์ของคุณ:
pause
ขี้เกียจหนึ่งซับ:
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
นี่คือวิธีที่ใช้งานได้ทั้งใน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
ใส่ไว้ในของคุณ.{ba,z}shrc
เพื่อความยุติธรรม!