Базовый сценарий Bash выдает нереальную ошибку

#bash #scripting

#bash #сценарий

Вопрос:

Это упражнение здесь, в лаборатории, сводит меня с ума! Хотя это кажется очень простой задачей, я получаю ошибки, и я действительно не знаю, откуда они берутся.

Простое упражнение:

  • С помощью сценария BASH прочитайте входные данные, проверьте, является ли это только серией чисел, и распечатайте что-то, связанное с ним.

Для сопоставления чисел я использую простое регулярное выражение. Код должен быть примерно таким:

 #!/bin/bash

echo "amount: "
read AMOUNT
REGEX="^[0-9]*$"
if [[ $AMOUNT =~ $REGEX ]]
then
    echo "amount (in $US) = "$AMOUNT
else
    echo "invalid amount, or input is not a number, quitting"
fi
  

Но независимо от того, как я на это смотрю, он выдает ошибку: "amount.sh: 11: [[: not found"
и даже профессор поражен.

Что я делаю не так?

(Используя оболочку BASH версии 4.1.5 с Ubuntu 10.04.)

Комментарии:

1. Работает здесь с использованием bash 4.1.5 в Ubuntu 10.04.

2. И здесь используется bash 4.1.7 на Fedora 14

3. Код отлично работает на моем компьютере, и я также использую Ubuntu 10.04 с Bash 4.1.5. Кроме того, это не должно иметь никакого отношения к вашей проблеме, но вам нужно избежать $ печати $US .

4. Как вы запускаете скрипт? Установив исполняемый файл или запустив «bash amount.sh » из оболочки?

5. Вероятно, вы вызываете свой скрипт с помощью sh script.sh вместо bash script.sh . В используемом мной окне Ubuntu /bin/sh есть /bin/dash , который не распознает [[ ]] .

Ответ №1:

Общие улучшения:

 #!/bin/bash

echo "amount: "
read AMOUNT
REGEX='^[0-9] $'
if [[ "$AMOUNT" =~ $REGEX ]]
then
    echo "amount (in $US) = $AMOUNT"
else
    echo "invalid amount, or input is not a number, quitting"
fi
  

Многие небольшие проблемные окна с цитированием закрыты. Я предположил, что вам требуется ввод (количество символов не будет ошибкой).

Комментарии:

1. -1 Не цитируйте $REGEX шаблон. Трудно найти документацию , но если вы процитируете шаблон, он будет обрабатываться как обычная строка. В bash нет необходимости заключать переменные в кавычки внутри [[ ]]

2. @glennjackman: ммм, вы правы — я этого не осознавал. исправлен ответ (на этот раз тоже протестировал его …)

3. Есть еще одно улучшение: read -p "amount: " AMOUNT будет выполняться ввод с запросом.

Ответ №2:

Я не могу воспроизвести это в bash 3.2.39 (Ubuntu 8.04.01). У вас есть ошибка в использовании $US , но [[ выглядит нормально. Я также тестировал с bash 4.1.10 (openSUSE 11).

Похоже, вы не предоставили нам весь свой сценарий. Он жалуется на строку 11, но в вашем скрипте есть [[ в строке 6.

Абсурдно … убедитесь, что ваш [ действительно символ в квадратной скобке, а не какой-то странный символ Юникода, который выглядит как квадратная скобка. Вы можете просто повторно ввести весь сценарий, учитывая, насколько он короткий (или вырезать и вставить его из этого вопроса, как я сделал).

Убедитесь, что в некоторых из этих строк у вас случайно нет новых строк Windows ( r n). Иногда это может создавать проблемы, подобные этой (хотя я действительно не верю, что в данном случае это проблема).

Для развлечения переключитесь на один, [ а не [[ . [ на самом деле является исполняемым файлом ( /usr/bin/[ ). Вероятно, он не будет обрабатывать =~ оператор, но вы бы увидели, произошли ли изменения в поведении.