Подтвердить что ты не робот

Bash пользовательский ввод, если

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

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

что я делаю неправильно?!

4b9b3361

Ответ 1

Вы можете рассмотреть явное приглашение: -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

Ответ 2

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:)

Ответ 3

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

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

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


Bash Руководство, Глава 4: Команды встроенных команд

прочитать

  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 text Если Readline используется для чтения строки, текст помещается в редактирование буфера до начала редактирования.

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

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

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

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

-s Тихий режим. Если вход поступает с терминала, символы не эхо.

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

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

Ответ 4

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

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

Ответ 5

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

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

Подробнее в руководстве bash можно найти в разделе "Расширение параметров".