пользовательский ввод bash, если - PullRequest
20 голосов
/ 04 апреля 2011

Я пытаюсь сделать простой

Do you want to do that? [Y,n] _

вопрос в bash.

я пытался

echo "Do that? [Y,n]"
read DO_THAT
if ["DO_THAT"="y"]; then
  do_that
fi

но не получается: bash: [y=y]: command not found

что я делаю не так ??!

Ответы [ 5 ]

46 голосов
/ 04 апреля 2011

Вы могли бы рассмотреть явный запрос: -p и указание ввода 1-символа -n1, который позволяет вставить y без ENTER.

read -n1 -p "Do that? [y,n]" doit 
case $doit in  
  y|Y) echo yes ;; 
  n|N) echo no ;; 
  *) echo dont know ;; 
esac
8 голосов
/ 04 апреля 2011
echo "Do that? [Y,n]"
read input
if [[ $input == "Y" || $input == "y" ]]; then
        echo "do that"
else
        echo "don't do that"
fi

Обратите особое внимание на синтаксис и интервал условного оператора if, он все время выводит меня в bash:)

6 голосов
/ 04 апреля 2011

Просмотрите параметры read в bash - вы можете делать подсказки и т. Д.

read -p "Do that? [Y,n]" -i Y input

В остальном, оставляйте пробелы вокруг имен команд ('[' - это команда - вы можете даженайдите его в /bin/[, хотя это также встроенная оболочка) и аргументы.


Руководство по Bash, глава 4: Команды построения оболочки

read

  read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars]  
       [-p prompt] [-t timeout] [-u fd] [name ...]

Одна строка считывается из стандартного ввода или из дескриптора файла fd, предоставленного в качестве аргумента опции '-u', и первое слово присваивается первому имени, второе слово - второмуимя и т. д. с оставшимися словами и их промежуточными разделителями, присвоенными фамилии.Если из входного потока прочитано меньше слов, чем имён, оставшимся именам присваиваются пустые значения.Символы в значении переменной IFS используются для разделения строки на слова.Символ обратной косой черты '\' может использоваться для удаления любого специального значения для следующего прочитанного символа и для продолжения строки.Если имена не указаны, считываемая строка присваивается переменной REPLY.Код возврата равен нулю, если только конец файла не встречен, время ожидания чтения (в этом случае код возврата больше 128) или неверный дескриптор файла предоставляется в качестве аргумента для -u.

Опции, если они указаны, имеют следующие значения:

-a aname Слова присваиваются последовательным индексам переменной массива aname, начиная с 0. Все элементы удаляются из aname перед присваиванием.Другие аргументы имени игнорируются.

-d delim Первый символ delim используется для завершения строки ввода, а не перевода строки.-e Readline (см. главу 8 [Редактирование командной строки], стр. 93) используется для получения строки.Readline использует текущие (или значения по умолчанию, если редактирование линии ранее не было активными) настройки редактирования.-i текст Если для чтения строки используется Readline, текст помещается в буфер редактирования перед началом редактирования.

-n nchars read возвращает после чтения символов nchars, а не в ожидании полной строки ввода, ноСоблюдайте разделитель, если перед разделителем читается меньше, чем nchars символов.

-N nchars read возвращает после чтения точно символов nchars вместо ожидания полной строки ввода, если только EOF не обнаружен или время ожидания не истекло.Символы-разделители, встречающиеся во входных данных, не обрабатываются специально и не приводят к тому, что чтение возвращается до тех пор, пока не будут прочитаны символы nchars.

-p приглашение Отображать приглашение без завершающего перевода строки перед попыткой чтения любого ввода.Подсказка отображается только в том случае, если ввод поступает с терминала.

-r Если задана эта опция, обратная косая черта не действует как escape-символ.Обратная косая черта считается частью линии.В частности, пара с обратной косой чертой и новой строкой не может использоваться в качестве продолжения строки.

-s Silent mode.Если вход поступает с терминала, символы не отображаются.

-t тайм-аут Причина чтения для тайм-аута и возврата ошибки, если полная строка ввода не читается в течение секунд ожидания.Тайм-аут может быть десятичным числом с дробной частью после десятичной точки.Эта опция эффективна, только если read читает входные данные из терминала, канала или другого специального файла;это не влияет на чтение из обычных файлов.Если тайм-аут равен 0, чтение возвращает успех, если входные данные доступны в указанном файловом дескрипторе, в противном случае ошибка.Состояние выхода превышает 128, если превышено время ожидания.

-u fd Чтение ввода из файлового дескриптора fd.

4 голосов
/ 05 ноября 2014

Вам нужно поставить пробел между «if» и переменной:

if [ $var == "y" ]; then echo "ese era el problema" fi

1 голос
/ 13 февраля 2013

Вы можете использовать оператор модификации регистра:

if [ "${DECISION^^}" = "Y" ]; then
...
fi

Вы можете найти больше в руководстве по bash в разделе «Расширение параметров».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...