Иногда я должен попросить, чтобы пользователь да/нет подтвердил что-то.
Обычно я использую что-то вроде этого:
# Yes/no dialog. The first argument is the message that the user will see.
# If the user enters n/N, send exit 1.
check_yes_no(){
while true; do
read -p "$1" yn
if [ "$yn" = "" ]; then
yn='Y'
fi
case "$yn" in
[Yy] )
break;;
[Nn] )
echo "Aborting..."
exit 1;;
* )
echo "Please answer y or n for yes or no.";;
esac
done;
}
Существует ли лучший способ сделать это? Эта утилита, возможно, уже в моем /bin
папка?
А-ч, существует что-то встроенное: zenity
графическая диалоговая программа:
if zenity --question --text="Is this OK?" --ok-label=Yes --cancel-label=No
then
# user clicked "Yes"
else
# user clicked "No"
fi
В дополнение к zenity
, можно использовать один из:
if dialog --yesno "Is this OK?" 0 0; then ...
if whiptail --yesno "Is this OK?" 0 0; then ...
Это выглядит хорошо мне. Я просто сделал бы его немного менее "отчаянным":
return 0
return 1
Тот путь можно сделать что-то как:
if check_yes_no "Do important stuff? [Y/n] "; then
# do the important stuff
else
# do something else
fi
# continue with the rest of your script
<час> С @muru select
предложение, функция может быть очень краткой:
check_yes_no () {
echo "$1"
local ans PS3="> "
select ans in Yes No; do
[[ $ans == Yes ]] && return 0
[[ $ans == No ]] && return 1
done
}
Я использую следующее:
read -p "??? Are You sure [y/N]? " -n 1
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "!!! Canceled by user."
exit 1
fi
read -p "??? Are You sure [Y/n]" -n 1
if [[ $REPLY =~ ^[Nn]$ ]]; then
echo "!!! Canceled by user."
exit 1
fi
read -p 'Are you sure you want to continue? (y/n) ' -n 1 confirmation
echo ''
if [[ $confirmation != 'y' && $confirmation != 'Y' ]]; then
exit 3
fi
# Code to execute if user wants to continue here.
Как заключение я записал этот сценарий:
#!/bin/bash
usage() {
echo "Show yes/no dialog, returns 0 or 1 depending on user answer"
echo "Usage: $0 [OPTIONS]
-x force to use GUI dialog
-m <string> message that user will see" 1>&2
exit 1;
}
while getopts m:xh opts; do
case ${opts} in
x) FORCE_GUI=true;
;;
m) MSG=${OPTARG}
;;
h) usage
;;
esac
done
if [ -z "$MSG" ];then
usage
fi
# Yes/no dialog.
# If the user enters n/N, return 1.
while true; do
if [ -z $FORCE_GUI ]; then
read -p "$MSG" yn
case "$yn" in
[Yy] )
exit 0;;
[Nn] )
echo "Aborting..." >&1
exit 1;;
* )
echo "Please answer y or n for yes or no.";;
esac
else
if [ -z $DISPLAY ]; then echo "DISPLAY variable is not set" >&1 ; exit 1; fi
if zenity --question --text="$MSG" --ok-label=Yes --cancel-label=No; then
exit 0
else
echo "Aborting..." >&1
exit 1
fi
fi
done;
Последняя версия сценария может быть найдена здесь. Заполнитесь свободный изменяться/редактировать