我正在尝试匹配记录为返回十六进制退出代码的进程的退出代码(例如,0x00
成功、0x40 - 0x4F
用户错误、0x50 - 0x5F
内部错误等)。我想通过语句处理退出代码case
,但“明显”的解决方案不匹配:
$ $val = 10
$ case $val in
> 0xA) echo match;;
> *) echo no match;;
> esac
no match
是否有一种可读的方法来匹配case
语句中的十六进制值?
答案1
是的,双括号算术运算符将把十六进制值显示为十进制,让case
它们匹配。
$ echo $((0xA))
10
$ case $val in
> $((0xA))) echo match;;
> *) echo no match;;
> esac
match
答案2
您可以将printf
值转换为十六进制字符串:
case $(printf '%02x' $val) in
0a) echo match;;
*) echo no match;;
esac
这将允许您匹配应用程序中的整个错误类别:
case $(printf '%02x' $?) in
00) echo success;;
4?) echo user error;;
5?) echo internal error;;
*) echo unrecognised error;;
esac
答案3
如果进程返回字符串 0x0A,则使用 0xA 时您的情况将失败。如果确实使用数字,则应该使用 10。