我想将 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