匹配 case 语句中的十六进制值

匹配 case 语句中的十六进制值

我正在尝试匹配记录为返回十六进制退出代码的进程的退出代码(例如,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。

相关内容