Không cần nhấn enter
Đây là một cách tiếp cận dài hơn, nhưng có thể tái sử dụng và mô-đun:
- Trả về
0
= có và 1
= không
- Không cần nhấn enter - chỉ một ký tự
- Có thể nhấn enterđể chấp nhận lựa chọn mặc định
- Có thể vô hiệu hóa lựa chọn mặc định để buộc lựa chọn
- Hoạt động cho cả
zsh
và bash
.
Mặc định là "không" khi nhấn enter
Lưu ý rằng đó N
là thủ đô. Ở đây nhập được nhấn, chấp nhận mặc định:
$ confirm "Show dangerous command" && echo "rm *"
Show dangerous command [y/N]?
Cũng lưu ý, điều đó [y/N]?
đã được tự động thêm vào. "Không" mặc định được chấp nhận, vì vậy không có gì được lặp lại.
Nhắc lại cho đến khi phản hồi hợp lệ được đưa ra:
$ confirm "Show dangerous command" && echo "rm *"
Show dangerous command [y/N]? X
Show dangerous command [y/N]? y
rm *
Mặc định là "có" khi nhấn enter
Lưu ý rằng Y
chữ viết hoa:
$ confirm_yes "Show dangerous command" && echo "rm *"
Show dangerous command [Y/n]?
rm *
Ở trên, tôi chỉ nhấn enter, nên lệnh chạy.
Không có mặc định trên enter- yêu cầu y
hoặcn
$ get_yes_keypress "Here you cannot press enter. Do you like this"
Here you cannot press enter. Do you like this [y/n]? k
Here you cannot press enter. Do you like this [y/n]?
Here you cannot press enter. Do you like this [y/n]? n
$ echo $?
1
Ở đây, 1
hoặc sai đã được trả lại. Lưu ý không viết hoa trong[y/n]?
Mã
# Read a single char from /dev/tty, prompting with "$*"
# Note: pressing enter will return a null string. Perhaps a version terminated with X and then remove it in caller?
# See https://unix.stackexchange.com/a/367880/143394 for dealing with multi-byte, etc.
function get_keypress {
local REPLY IFS=
>/dev/tty printf '%s' "$*"
[[ $ZSH_VERSION ]] && read -rk1 # Use -u0 to read from STDIN
# See https://unix.stackexchange.com/q/383197/143394 regarding '\n' -> ''
[[ $BASH_VERSION ]] && </dev/tty read -rn1
printf '%s' "$REPLY"
}
# Get a y/n from the user, return yes=0, no=1 enter=$2
# Prompt using $1.
# If set, return $2 on pressing enter, useful for cancel or defualting
function get_yes_keypress {
local prompt="${1:-Are you sure} [y/n]? "
local enter_return=$2
local REPLY
# [[ ! $prompt ]] && prompt="[y/n]? "
while REPLY=$(get_keypress "$prompt"); do
[[ $REPLY ]] && printf '\n' # $REPLY blank if user presses enter
case "$REPLY" in
Y|y) return 0;;
N|n) return 1;;
'') [[ $enter_return ]] && return "$enter_return"
esac
done
}
# Credit: http://unix.stackexchange.com/a/14444/143394
# Prompt to confirm, defaulting to NO on <enter>
# Usage: confirm "Dangerous. Are you sure?" && rm *
function confirm {
local prompt="${*:-Are you sure} [y/N]? "
get_yes_keypress "$prompt" 1
}
# Prompt to confirm, defaulting to YES on <enter>
function confirm_yes {
local prompt="${*:-Are you sure} [Y/n]? "
get_yes_keypress "$prompt" 0
}
info bash
: "Đối với hầu hết mọi mục đích, các hàm shell được ưa thích hơn các bí danh."