IPアドレス文字列操作の問題

IPアドレス文字列操作の問題

10.AB.C95桁の数字で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.591205510.5.591200010.0.9

おすすめ記事