Как мне запросить у пользователя подтверждение в bash-скрипте? [Дубликат]

391

Я хочу быстро сказать "ты уверен?" запросите подтверждение в верхней части потенциально опасного bash script, что это самый простой/лучший способ сделать это?

Теги:

10 ответов

603
Лучший ответ
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.

  • 0
    спасибо, что делают двойные квадратные скобки?
  • 0
    и можно ли это отрицать? т.е. если не совпадает, выход?
Показать ещё 32 комментария
107

использовать кейс /esac.

read -p "Continue (y/n)?" choice
case "$choice" in 
  y|Y ) echo "yes";;
  n|N ) echo "no";;
  * ) echo "invalid";;
esac
Преимущество

:

  • аккуратнее
  • может легче использовать условие "ИЛИ"
  • может использовать диапазон символов, например [yY] [eE] [sS], чтобы принять слово "да", где любой из его символов может быть в нижнем регистре или в верхнем регистре.
  • 7
    Хорошее решение Лично, если сценарий bash действительно может нанести вред, я бы хотел, чтобы человек напечатал «да».
  • 0
    Как я могу использовать это для выхода, когда ввод - нет (может быть, echo "Quitting script."; exit;; ), но если ввод - да, скрипт просто продолжит то, что следует после esac ?
Показать ещё 3 комментария
24

Таким образом вы получите "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
  • 0
    Не принимает по умолчанию Y
  • 1
    По умолчанию Y if [[$ response = ~ ^ (yes | y |)]] | [-z $ response]; затем
Показать ещё 1 комментарий
24

Попробуйте встроенную оболочку read:

read -p "Continue (y/n)?" CONT
if [ "$CONT" = "y" ]; then
  echo "yaaa";
else
  echo "booo";
fi
17

Здесь функция, которую я использую:

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...
  • Выход всегда "да" или "нет"
  • По умолчанию "нет"
  • Все, кроме "y" или "yes", возвращает "нет" , поэтому довольно безопасно для опасного bash script
  • И он нечувствителен к регистру, "Y", "Да" или "ДА" работает как "да".

Надеюсь, вам это понравится,
Ура!

11

Это то, что я нашел в другом месте, есть ли более возможная версия?

read -p "Are you sure you wish to continue?"
if [ "$REPLY" != "yes" ]; then
   exit
fi
4
[[ -f ./${sname} ]] && read -p "File exists. Are you sure? " -n 1

[[ ! $REPLY =~ ^[Yy]$ ]] && return 1

использовал это в функции для поиска существующего файла и запроса перед перезаписью.

  • 2
    Парсер жалуется на return за пределы функции, вы, вероятно, имели в виду exit . Мне все еще нравится ваш ответ, потому что он не имеет отступа для кода, который будет выполнен, если он будет подтвержден.
3
#!/bin/bash
echo Please, enter your name
read NAME
echo "Hi $NAME!"
if [ "x$NAME" = "xyes" ] ; then
 # do something
fi

Я короткую script, чтобы читать в bash и возвращать результаты.

2
echo are you sure?
read x
if [ "$x" = "yes" ]
then
  # do the dangerous stuff
fi
2

qnd: используйте

read VARNAME
echo $VARNAME

для ответа одной строки без поддержки readline. Затем проверьте $VARNAME, но вы хотите.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню