如果转换结果为单个十六进制字母 (Bash),则将十进制转换为十六进制并放置一个起始零

Convert Decimal to Hex and place a starting zero if the conversion results in a single hex letter (Bash)

这是我的案例场景...

我正在编写一个 bash 脚本来验证我所有的 VPN 证书并检查它们是否已过期。 VPN 证书(.crt 文件)通常有关联的私钥(.pem 文件)。那些.crt文件中写有一个唯一的整数序列号,.pem文件的命名是根据这个序列号转换成十六进制。

示例:

要验证证书是否已过期,我使用此命令:

openssl verify -CAfile /etc/openvpn/keys/my-organization/ca.pem /etc/openvpn/keys/my-organization/xx.pem

所以我需要知道证书中的序列号并将它们转换为十六进制以了解所有 .pem 文件的名称。

这是我的脚本:

#!/bin/bash

serial_numbers=(`cat /etc/openvpn/keys/my-organization/*.crt | grep "Serial Number" | awk '{print }'`)

for number in ${serial_numbers[*]}; do
    toHex=(`echo "obase=16; $number" | bc`)

    for item in ${toHex[*]}; do
        verify=(`openssl verify -CAfile /etc/openvpn/keys/my-organization/ca.pem /etc/openvpn/keys/my-organization/"$item".pem`)

        for line in ${verify[*]}; do
            echo $line
        done
    done
done

这行得通,但对于某些人我得到 没有这样的文件或目录... 某些序列号在转换为十六进制时会生成单个字母。在这种情况下,.pem 文件的名称应以 0(零)开头。

示例:

我怎样才能通过它并使其适用于所有情况?

您可以使用格式 printf:

$ printf '%02X\n' 15 44
0F
2C

%X 是大写字符的十六进制,02 是零填充,宽度至少为 2。

你可以替换这个语句

toHex=(`echo "obase=16; $number" | bc`)

printf -v toHex '%02X' "$number"