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

Вы не хотите подавлять все, так как это замедляет ваш скрипт.

И да, есть способ как в php.ini, так и внутри вашего скрипта удалить ошибки (но делать это только тогда, когда вы находятся в живой среде и записывают ваши ошибки из php)


И вы можете прочитать это для версии php.ini, отключив ее.

531
задан Tom 11 December 2009 в 02:52
поделиться

7 ответов

read -p "Are you sure? " -n 1 -r
echo    # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]
then
    # do dangerous stuff
fi

Я включил предложение levislevis85 (спасибо!) И добавил параметр -n в read , чтобы принять один символ без необходимости нажимать Введите . Вы можете использовать один или оба из них.

Кроме того, отрицательная форма может выглядеть так:

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

Однако, как указал Эрих, при некоторых обстоятельствах, таких как синтаксическая ошибка, вызванная запуском сценария в неправильном shell, инвертированная форма может позволить сценарию продолжить «опасные вещи». Режим отказа должен способствовать наиболее безопасному исходу, поэтому следует использовать только первый неотрицательный , если .

Пояснение:

Команда read выводит приглашение ( ] -p "подсказка" ) затем принимает один символ ( -n 1 ) и принимает обратную косую черту буквально ( -r ) (в противном случае чтение будет рассматривать обратную косую черту как escape и ждать второго символа). Переменная по умолчанию для чтения для сохранения результата - $ REPLY , если вы не укажете такое имя: read -p "my prompt" -n 1 - r my_var

Оператор if использует регулярное выражение, чтобы проверить, соответствует ли символ в $ REPLY ( = ~ ) верхнему или нижнему регистру "Y ". В используемом здесь регулярном выражении говорится: «строка, начинающаяся ( ^ ) и состоящая исключительно из одного из списка символов в выражении в квадратных скобках ( [Yy] ) и заканчивающемся ( $ ) ". Якоря ( ^ и $ ) предотвращают сопоставление более длинных строк. В этом случае они помогают усилить ограничение в один символ, установленное в команде read .

В инвертированной форме используется логический оператор «не» (! ) для соответствия ( ] = ~ ) любой символ, кроме «Y» или «y». Альтернативный способ выразить это менее читабелен и, на мой взгляд, не так ясно выражает намерение в данном случае. Однако это будет выглядеть так: if [[$ REPLY = ~ ^ [^ Yy] $]]

891
ответ дан 22 November 2019 в 22:13
поделиться

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

read -p "Continue (y/n)?" CONT
if [ "$CONT" = "y" ]; then
  echo "yaaa";
else
  echo "booo";
fi
33
ответ дан 22 November 2019 в 22:13
поделиться

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

read -p "Are you sure you wish to continue?"
if [ "$REPLY" != "yes" ]; then
   exit
fi
17
ответ дан 22 November 2019 в 22:13
поделиться
#!/bin/bash
echo Please, enter your name
read NAME
echo "Hi $NAME!"
if [ "x$NAME" = "xyes" ] ; then
 # do something
fi

Это короткий сценарий для чтения в bash и вывода результатов.

4
ответ дан 22 November 2019 в 22:13
поделиться

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

read VARNAME
echo $VARNAME

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

2
ответ дан 22 November 2019 в 22:13
поделиться
echo are you sure?
read x
if [ "$x" = "yes" ]
then
  # do the dangerous stuff
fi
2
ответ дан 22 November 2019 в 22:13
поделиться

use case/esac.

read -p "Continue (y/n)?" choice
case "$choice" in 
  y|Y ) echo "yes";;
  n|N ) echo "no";;
  * ) echo "invalid";;
esac

advantage:

  1. neater
  2. can use "OR" condition easier
  3. can use character range, eg [yY][eE][sS] to accept word "yes", where any of its characters may be in lowercase or in uppercase.
158
ответ дан 22 November 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: