10.AB.C9
5桁の数字で3つのオクテットを作成しようとしています12ABC
。 ::
12
=最初のオクテットAB
= 2番目のオクテットC
= 3番目のオクテット
既存のコードには、誤ったIPが生成される可能性がある2つの状況があります。 Cに先行ゼロがある場合(例:02)、3番目のオクテットは027になり、IPはハードコーディングされた先行ゼロを持つことができません。
five_digits=12620
if [ "${five_digits:4:1}" -eq 0 ]; then
ip_main="10.${five_digits:2:2}.9"
gateway_ip_prefix="10.${five_digits:2:2}.2"
elif [ "${five_digits:4:1}" -ne 0 ]; then
ip_main="10.${five_digits:2:2}.${five_digits:4:1}9"
gateway_ip_prefix="10.${five_digits:2:2}.${five_digits:4:1}2"
上記のコードはCの先行ゼロ問題を解決します。
2番目のケースは、Aが0であることです。これは、2番目のオクテットの前にゼロがあることを意味します。この状況をどのように処理するのかわからず、スクリプトをより簡単にしたいと思います。
答え1
各オクテットを分離し、各オクテットから先行ゼロを削除し、一緒に接続します。このような:
str="$five_digits"
if [[ ${#str} != 5 ]] || [[ ${str:0:2} != "12" ]]; then
echo invalid input >&2;
exit 1;
fi
a=10 # first octet, constant
b=${str:2:2} # second octet
b=${b#0} # remove one leading zero
c=${str:4:1}9 # third octet
c=${c#0} # remove one leading zero
res="$a.$b.$c" # concatenated result
echo "$res"
たとえば、入力文字列を。に12345
変更します。10.34.59
12055
10.5.59
12000
10.0.9