我收到上述语法错误,但我无法破译它出了什么问题。我正在尝试在 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
Awk 脚本中出现语法错误的原因是当$getPrice
为空时,脚本实际上只是
BEGIN{if (>0) exit 1}
将 shell 变量作为 Awk 变量导入到 Awk 脚本中的正确方法是使用-v
:
awk -vprice="$getPrice" 'BEGIN { if (price > 0) exit 1 }'
我还查看了脚本中的控制流程,$empty
您可以在输入正确的价格后退出循环,而不是使用变量:
while true; do
read -p 'Price : ' 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!' >&2
done
评论后的补充细节:
如果输入的值不是数字或者为负数,则应提醒用户输入无效。我们可以测试输入值中是否存在不应该出现的字符(除了数字 0 到 9 和小数点之外的任何字符):
while true; do
read -p 'Price : ' 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!' >&2
done
答案2
如果$getPrice
为空,则此行
awk 'BEGIN{if ('$getPrice'>'0') exit 1}'
变成
awk 'BEGIN{if (>0) exit 1}'
这可能不是你想要的。您可以使用 shell 替换之一来提供非空值(尽管仍然不建议像这样混合 shell 和 awk):
awk 'BEGIN{if ('${getPrice:-0}'>'0') exit 1}'
最好使用-v
选项将变量传递给 awk (但这实际上是一个不同的问题,已回答多次)。
答案3
如果里面什么都没有,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>