如何将 AWK 脚本的返回值(退出状态)复制或读取到 shell 脚本(bash)中,以便在 if 语句中进行比较

如何将 AWK 脚本的返回值(退出状态)复制或读取到 shell 脚本(bash)中,以便在 if 语句中进行比较

我想将 awk 脚本的错误代码或退出状态读取到 shell 中,以便在 if 条件下使用来比较错误处理,我的 shell 脚本如下所示:

我的脚本:

#!/bin/sh

awk -v CONFIG_SOURCE=Testfile1.txt -f test.awk

echo $?  # prints the error code '2' in this case, if the file is actually not available
recval =  $?

if ($recval == '$2') **//this condition statement doesn't seems to work.**
then 
echo "Some error"
fi

测试.awk 文件:

BEGIN {
   ignore_line = 0;
   if ( CONFIG_SOURCE == "" )
   {
      print "Error: Invalid embed source file.";
      exit 1
   }
   if ( 0 != system( "[ -f " CONFIG_SOURCE " ] " ) )
   {
      print "Error: Embed source file '" CONFIG_SOURCE "' does not exist."
      exit 2
   }
}

因此,如果文件不可用,它将返回退出状态“2”,我可以回显,但是如何将值“2”或退出状态复制到 shell 中的某个变量(recval))

答案1

这应该有效:

#!/bin/sh

awk -v CONFIG_SOURCE=Testfile1.txt -f test.awk

re=$?
echo "$re"

if [ "$re" -eq 2 ]; then
  echo >&2 "Some error"
fi

您的脚本中的问题是echo $?before的使用recval = $?。当您打印(最后一条语句的退出状态)echo $?的值时,$?然后$?被覆盖echo $?。最后一条语句的退出状态就是 的退出状态echo $?,可能为 0。

答案2

你的基本逻辑是正确的,但你的 shell 语法是错误的。

  • 赋值必须是单个单词,不能在等号两边放置空格:使用两个参数recval = $?运行命令,并且.recval=$?
  • 命令后$?的值为$?echo命令;保存$?到另一个变量必须是您要做的第一件事。要查看 shell 脚本正在做什么,请让它打印一条跟踪:set -x在顶部、该#!行下方添加。
  • '$2'是一个两个字符的字符串。对于数字 2,写2。但要测试是否存在错误,请测试状态是否为非零:2 只是可能的值之一。
  • 有多种方法可以比较整数,但您所写的不是一种。
    • [ "$x" -eq "$y" ](便携的)
    • [[ $x -eq $y ]](仅在 ksh、bash、zsh 中,但不在 中/bin/sh
    • ((x == y))(仅在 ksh93、bash、zsh 中,但不在 中/bin/sh
  • 错误消息转到标准错误(文件描述符 2),而不是标准输出。
  • 如果 awk 失败,那么您的脚本可能也应该返回非零状态。

这是一个更正后的脚本:

#!/bin/sh
awk -v CONFIG_SOURCE=Testfile1.txt -f test.awk
awk_status=$?
if [ "$awk_status" -eq 2 ]; then
  echo 1>&2 "Additional information regarding the error message from awk just above"
  exit $awk_status
fi

答案3

包含$?非常的退出代码的值最后一个命令被执行。您也可以在 case 语句中堆叠退出代码。

#!/usr/bin/env bash

awk -v CONFIG_SOURCE=Testfile1.txt -f test.awk &> /dev/null

recval=$?

case $recval in
    0) echo "Exit code 0"
       ;;
    1) echo "Exit code 1"
       ;;
    2) echo "Exit code 2"
       ;;
esac

相关内容