#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/[
). Вероятно, он не будет обрабатывать =~
оператор, но вы бы увидели, произошли ли изменения в поведении.