Я хочу быстро сказать "ты уверен?" запросите подтверждение в верхней части потенциально опасного bash script, что это самый простой/лучший способ сделать это?
read -p "Are you sure? " -n 1 -r
echo # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]
then
# do dangerous stuff
fi
Edit
Я включил предложение levislevis85 (спасибо!) и добавил параметр -n
к read
, чтобы принять один символ без необходимости нажимать Enter. Вы можете использовать один или оба из них.
Кроме того, отрицательная форма может выглядеть так:
read -p "Are you sure? " -n 1 -r
echo # (optional) move to a new line
if [[ ! $REPLY =~ ^[Yy]$ ]]
then
[[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1 # handle exits from shell or function but don't exit interactive shell
fi
Однако, как указал Эрих, при некоторых обстоятельствах, таких как синтаксическая ошибка, вызванная тем, что script выполняется в неправильной оболочке, отрицательная форма может позволить script продолжить "опасный материал". Режим отказа должен поддерживать самый безопасный результат, поэтому следует использовать только первый, неотрицаемый if
.
использовать кейс /esac.
read -p "Continue (y/n)?" choice
case "$choice" in
y|Y ) echo "yes";;
n|N ) echo "no";;
* ) echo "invalid";;
esac
Преимущество :
echo "Quitting script."; exit;;
), но если ввод - да, скрипт просто продолжит то, что следует после esac
?
Таким образом вы получите "y" "да" или 'Enter'
read -r -p "Are you sure? [Y/n]" response
response=${response,,} # tolower
if [[ $response =~ ^(yes|y| ) ]] || [[ -z $response ]]; then
your-action-here
fi
Попробуйте встроенную оболочку read
:
read -p "Continue (y/n)?" CONT
if [ "$CONT" = "y" ]; then
echo "yaaa";
else
echo "booo";
fi
Здесь функция, которую я использую:
function ask_yes_or_no() {
read -p "$1 ([y]es or [N]o): "
case $(echo $REPLY | tr '[A-Z]' '[a-z]') in
y|yes) echo "yes" ;;
*) echo "no" ;;
esac
}
И пример использования:
if [[ "no" == $(ask_yes_or_no "Are you sure?") || \
"no" == $(ask_yes_or_no "Are you *really* sure?") ]]
then
echo "Skipped."
exit 0
fi
# Do something really dangerous...
Надеюсь, вам это понравится,
Ура!
Это то, что я нашел в другом месте, есть ли более возможная версия?
read -p "Are you sure you wish to continue?"
if [ "$REPLY" != "yes" ]; then
exit
fi
[[ -f ./${sname} ]] && read -p "File exists. Are you sure? " -n 1
[[ ! $REPLY =~ ^[Yy]$ ]] && return 1
использовал это в функции для поиска существующего файла и запроса перед перезаписью.
return
за пределы функции, вы, вероятно, имели в виду exit
. Мне все еще нравится ваш ответ, потому что он не имеет отступа для кода, который будет выполнен, если он будет подтвержден.
#!/bin/bash
echo Please, enter your name
read NAME
echo "Hi $NAME!"
if [ "x$NAME" = "xyes" ] ; then
# do something
fi
Я короткую script, чтобы читать в bash и возвращать результаты.
echo are you sure?
read x
if [ "$x" = "yes" ]
then
# do the dangerous stuff
fi
qnd: используйте
read VARNAME
echo $VARNAME
для ответа одной строки без поддержки readline. Затем проверьте $VARNAME, но вы хотите.