【问题标题】:AWK BEGIN IF syntax queryAWK BEGIN IF 语法查询
【发布时间】:2018-07-03 11:04:44
【问题描述】:

所以我想要实现的是对用户输入进行验证检查,以确保输入大于 0。但是,在我的 Linux 环境中将它带到 gedit 时,我收到了一大堆粉红色的文字,这绝对意味着语法错误,但不知何故我就是不明白。

我在 shellscript 方面相对较新(2 周),所以如果有人能向我解释他/她的解决方案,我将不胜感激。我也尝试在出口 1 之前放置一个 END 无济于事。提前谢谢!

导致问题的代码行:

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

案例 C 的完整代码:

[Cc] | [C|c] ) read -p "New Price: " get_price
        awk 'BEGIN{if($get_price>'0') exit 1}'
        if [ $? -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;;

【问题讨论】:

    标签: shell awk sh


    【解决方案1】:

    首先,如果你想使用awk中的shell变量的值,你应该这样做:

    awk -v awkVar="$shellVar" '{..awk..codes... print awkVar}' ...
    

    在 awk 中,$foo 表示当前行中的foo-th 列。

    你的 awk 代码中的 exit 也只会退出 awk 处理,它不会退出你的整个 shellscript。我认为您应该以 shell 方式检查给定 get_price 的用户。

    【讨论】:

      【解决方案2】:

      awk 不是外壳。 awk 是一个可以从 shell 调用来操作文本的工具。它有自己的语法、语义、符号范围等。可以把它想象成从 shell 调用 C 程序,而不是尝试从 shell 调用某种 shell 子例程。

      听起来你正在寻找这样的东西:

      delim="--------------------------------------------"
      while IFS= read -r -p "New Price: " price; do
          awk -v price="$price" 'BEGIN {
              exit ( (price+0 == price) && (price > 0) ? 0 : 1 )
          }'
          if [ $? -eq 0 ]; then
              PRICE["$index"]="$price"
              echo "The book price has been updated successfully!"
              echo "$delim"
              break
          else
              tput setf 4;echo "Please input a valid price!";tput setf 2;
              echo "$delim"
          fi
      done
      

      条件price+0 == price 是您验证变量price 是否包含数字的方式。

      请注意,shell 中的成功退出状态是0,而不是1 或任何其他数字。

      【讨论】:

      • 非常感谢!我最能理解你的解决方案,而且我学到了很多关于它的语法。
      【解决方案3】:

      awk 没有解决这里的问题。 exit in awk 只是从 awk 中退出。 您需要的是紧跟在read 之后的测试构造,如下所示。

      你有两个要求:

      • get_price 应该是一个数字(记住用户可以输入任何内容)。
      • get_price 应该大于零。

      ! [[ "${get_price:-s}" =~ ^[0-9]*(\.[0-9]+)?$ ]] && echo "Entered price is not decimal" && exit 1
      [ ${get_price:-0} -le 0 ] && echo "Price should be a value greater than zero. Aborting.." && exit 1
      

      注意:更多关于shell参数替换here:-)

      【讨论】:

      • @EdMorton 谢谢。解决了这个问题。
      猜你喜欢
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 2016-12-23
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      相关资源
      最近更新 更多