IP 주소 문자열 연산 문제

IP 주소 문자열 연산 문제

10.AB.C95자리 숫자로 3개의 옥텟을 만들려고 합니다 12ABC. ::

  • 12= 첫 번째 옥텟
  • AB= 두 번째 옥텟
  • C= 세 번째 옥텟

기존 코드에는 잘못된 IP가 생성될 수 있는 두 가지 상황이 있습니다. C에 선행 0이 있는 경우(예: 02) 세 번째 옥텟은 027이 되며 IP는 하드 코딩된 선행 0을 가질 수 없습니다.

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의 선행 0 문제를 해결합니다.

두 번째 경우는 A가 0이라는 것입니다. 이는 두 번째 옥텟의 앞에 0이 있음을 의미합니다. 이 상황을 어떻게 처리해야 할지 잘 모르겠고 스크립트를 더 간단하게 만들고 싶습니다.

답변1

각 옥텟을 분리하고 각 옥텟에서 선행 0을 제거한 다음 함께 연결합니다. 이 같은:

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

관련 정보