Я получаю указанную выше синтаксическую ошибку и не могу понять, что с ней не так. Я пытаюсь сделать значение с плавающей запятой в 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
. После долгих раздумий я все еще не мог понять, что не так с синтаксисом. С Уважением.
Причина, по которой вы получаете синтаксическую ошибку в вашем сценарии 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
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
вариант (но на самом деле это другой вопрос, на который ответили несколько раз).
Если в 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>