10.AB.C9
5자리 숫자로 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.59
12055
10.5.59
12000
10.0.9