awk: строка 1: синтаксическая ошибка около>

Я получаю указанную выше синтаксическую ошибку и не могу понять, что с ней не так. Я пытаюсь сделать значение с плавающей запятой в BASH.

Поэтому я использовал эту команду под названием awk для достижения цели.

while $empty; do
    empty=false
    echo -n "Price : "; read getPrice

#float value using awk
awk 'BEGIN{if ('$getPrice'>'0') exit 1}'
    if [ $? -eq 1 ]; then
    PRICE[$COUNT]=$getPrice;

else
    empty=true 
    echo "Please put in the correct price figure!"
fi

done

Однако я получил эту ошибку

awk: строка 1: синтаксическая ошибка на уровне>

или около него. Эта ошибка возникла, когда я не ввел никакого значения в переменную getPrice . Однако он работает нормально, когда я ввожу какое-то значение, которое составляет > 0 . После долгих раздумий я все еще не мог понять, что не так с синтаксисом. С Уважением.

-1
21.01.2017, 18:20
3 ответа

Причина, по которой вы получаете синтаксическую ошибку в вашем сценарии Awk, заключается в том, что когда $ getPrice пуст, тогда сценарий на самом деле просто

BEGIN{if (>0) exit 1}

Правильный способ импортировать переменную оболочки в сценарий Awk в качестве переменной Awk - использовать -v :

awk -vprice="$getPrice" 'BEGIN { if (price > 0) exit 1 }'

Я также посмотрел на поток управления в вашем скрипте, и вместо использования переменной $ empty вы можете просто выйти из цикла, когда будет введена правильная цена:

while true; do
    echo -n "Price : "
    read getPrice

    # compare float value using awk
    if awk -vprice="$getPrice" 'BEGIN { if (price <= 0) exit(1) }'
    then
      PRICE[$COUNT]="$getPrice"
      break
    fi

    echo "Please put in the correct (positive) price figure!"
done

Дополнительная информация после комментариев:

Конечно, следует предупреждаться о недопустимом вводе, если введенное значение не является числом или отрицательным. Мы можем проверить введенное значение на наличие символов, которых не должно быть (что-либо, кроме цифр от 0 до 9 и десятичной точки):

while true; do
    echo -n "Price : "
    read getPrice

    if [[ ! "$getPrice" =~ [^0-9.] ]] && \
        awk -vprice="$getPrice" 'BEGIN { if (price <= 0) exit(1) }'
    then
        PRICE[$COUNT]="$getPrice"
        break
    fi

    echo "Please put in the correct (positive) price figure!"
done
4
28.01.2020, 05:07

If $ getPrice пуст, эта строка

awk 'BEGIN{if ('$getPrice'>'0') exit 1}'

становится

awk 'BEGIN{if (>0) exit 1}'

, что, вероятно, не то, что вы планировали. Вы можете использовать одну из замен оболочки, чтобы указать непустое значение (хотя смешивание оболочки и awk подобным образом не рекомендуется):

awk 'BEGIN{if ('${getPrice:-0}'>'0') exit 1}'

Лучше передавать переменные в awk с помощью -v вариант (но на самом деле это другой вопрос, на который ответили несколько раз).

2
28.01.2020, 05:07

Если в getPrice ничего нет, то код awk - это

BEGIN{if (>0) exit 1}

, что является полностью недопустимым синтаксисом. Будьте осторожны, чтобы getPrice не было пустым (или, еще лучше, убедитесь, что это какое-то число).

Действительно ли bash является требованием? Это было бы проще в ZSH или на любом другом языке с поддержкой с плавающей запятой:

bash-3.2$ exec zsh
% echo 3.14 | read x; [[ $x -gt 0 ]] && echo positive
positive
% exec tclsh
tclsh> set x [read stdin]
3.14
3.14

tclsh> if {$x > 0} { puts positive }
positive
tclsh> 
0
28.01.2020, 05:07

Теги

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