Shell脚本AWK BEGIN IF语法错误:用户输入价格验证求助
解决Shell脚本中输入验证的语法错误问题
刚学两周Shell就动手写功能脚本,已经超棒啦!咱们一步步拆解你遇到的问题:
你的代码里的几个关键错误
引号不匹配导致语法断裂
你写的awk 'BEGIN{if($get_price>'0') exit 1}'里,>'0'的单引号和外层包裹awk代码的单引号冲突了——Shell会把第一个'到>'前的'当成一个完整字符串,后面的内容就变成了无意义的语法碎片,这就是gedit里大量粉色高亮的核心原因。awk无法直接读取Shell变量
awk有自己独立的运行环境,$get_price这种写法在awk的BEGIN块里完全不生效,因为awk根本不知道Shell的get_price变量是什么。Shell语法细节错误
read -p "New Price: " get_price后面直接跟awk,没加分号或换行,Shell会把两行当成一个命令解析,必然报错。if [ $? -eq 1];里的];中间必须有空格,Shell的test命令(也就是[ ])要求括号和内容之间必须留空格。
修正后的完整代码&解释
咱们逐个修复问题,同时给你两种验证方案:一种用Shell原生判断(新手更好理解),一种保留awk实现:
方案1:用Shell原生判断验证(推荐新手)
[Cc] | [C|c] ) read -p "New Price: " get_price # 验证:是数字格式,并且大于0 if [[ "$get_price" =~ ^[0-9]+(\.[0-9]+)?$ && $(echo "$get_price > 0" | bc) -eq 1 ]]; then PRICE[$index]=$get_price echo "The book price has been updated successfully!" echo "--------------------------------------------" else tput setf 4 echo "Please input a valid price!" tput setf 2 echo "--------------------------------------------" fi press_enter ;;
方案2:用awk实现验证(修正你的写法)
[Cc] | [C|c] ) read -p "New Price: " get_price # 用-v参数把Shell变量get_price传给awk的内部变量p awk -v p="$get_price" 'BEGIN{if(p <= 0) exit 1}' # 注意空格:[ 和 $?之间、1和]之间都要有空格 if [ $? -eq 0 ]; then PRICE[$index]=$get_price echo "The book price has been updated successfully!" echo "--------------------------------------------" else tput setf 4 echo "Please input a valid price!" tput setf 2 echo "--------------------------------------------" fi press_enter ;;
关键修正点说明:
- 方案2里用
awk -v p="$get_price"把Shell变量传递给awk,让awk能拿到输入值; - 统一引号用法,避免引号冲突;
- 修复了
if [ ]里的空格问题; - 把awk的判断逻辑反过来:价格<=0时exit 1,这样
$? -eq 0就代表验证通过,逻辑更直观。
额外小提示
gedit出现粉色语法高亮,90%是引号不匹配或括号不闭合,你可以把光标放在引号/括号上,gedit会高亮对应的配对符号,快速定位断裂点~
内容的提问来源于stack exchange,提问作者Incentive
相关产品推荐
相关产品推荐

