Sim, o operador aritmético dos dois parênteses exibirá valores hexadecimais como decimal, deixando case
combiná-los.
$ echo $((0xA))
10
$ case $val in
> $((0xA))) echo match;;
> *) echo no match;;
> esac
match
Estou tentando corresponder os códigos de saída de um processo que está documentado para retornar códigos de saída hexadecimais (por exemplo, 0x00
para sucesso, 0x40 - 0x4F
no erro do usuário, 0x50 - 0x5F
no erro interno etc.). Gostaria de lidar com o código de saída por meio de uma instrução case
, mas a solução "óbvia" não corresponde:
$ $val = 10
$ case $val in
> 0xA) echo match;;
> *) echo no match;;
> esac
no match
Existe uma maneira legível de combinar valores hexadecimais em uma instrução case
?
Sim, o operador aritmético dos dois parênteses exibirá valores hexadecimais como decimal, deixando case
combiná-los.
$ echo $((0xA))
10
$ case $val in
> $((0xA))) echo match;;
> *) echo no match;;
> esac
match
Você poderia printf
o valor para uma string hexadecimal:
case $(printf '%02x' $val) in
0a) echo match;;
*) echo no match;;
esac
Isso permitirá que você corresponda a todas as classes de erro do seu aplicativo:
case $(printf '%02x' $?) in
00) echo success;;
4?) echo user error;;
5?) echo internal error;;
*) echo unrecognised error;;
esac
Se o processo retornar a string 0x0A, o seu caso falhará usando 0xA. Se estiver realmente usando números, você deve usar 10 em lugar.