기본 숫자를 접두사로 두 자리 0으로 설정하는 쉘 스크립트

기본 숫자를 접두사로 두 자리 0으로 설정하는 쉘 스크립트

처리 중인 쉘 스크립트에서 일부 추가 프로세스가 출력을 인쇄합니다. 한 자리 숫자인 경우 접두사로 0을 추가해야 합니다.

이것은 내 현재 스크립트입니다.

c_year=2020
for i in {01..11}
        do  
            n_year=2020
            echo 'Next Year:'$n_year
            if [[ $i == 11 ]]
            then n_month=12
            echo 'Next Month:'$n_month
            else 
            n_month=$(($i + 1))
            echo 'Next Month:'$n_month
            fi
            echo $date" : Processing data '$c_year-$i-01 00:00:00' and '$n_year-$n_month-01 00:00:00'"
        done

i은 두 자리이지만 n_month여전히 한 자리가 인쇄됩니다. 기본 쉘 출력을 설정하는 방법은 두 자리 숫자를 반환해야 합니까?

아니면 이 문제를 해결할 수 있는 다른 방법이 있습니까?

답변1

다양한 상황에서 앞에 0이 있는 숫자는 다음과 같이 해석되므로 소수 값을 저장하는 변수에 앞에 0을 사용하지 마십시오.8진수. 산술 확장이 그 중 하나입니다. 다음 코드는 실패합니다.

i1=09
i2=$((i1+1))

이것이 작동하는 동안:

i1=9
i2=$((i1+1))

결과를 인쇄할 때는 앞에 0만 추가하세요. 올바른 형식을 사용하여 printf이를 수행하십시오 . 예:

i1=9
i2=$((i1+1))
year1=2020
year2=2020

printf "Processing data '%04d-%02d-01 00:00:00' and '%04d-%02d-01 00:00:00'\n" "$year1" "$i1" "$year2" "$i2"


숫자가 예상되는 경우 printf앞에 0이 있는 문자열을 8진수로 해석합니다. 따라서 이것은 조심해야 할 또 다른 상황입니다. 예:

$ printf '%02d\n' 9
09
$ printf '%02d\n' 09
printf: '09': value not completely converted
00
$ printf '%02d\n' 012
10

즉, printf %02d앞에 0을 피하면 해결책이 될 수 있지만 그렇지 않으면 버그가 될 수 있습니다.

답변2

나는 이것이 가능성이라고 생각합니다.

for i in {1..11}; do  
    n_month=$(($i + 1))
    [[ $n_month =~ ^[0-9]$ ]] && n_month="0$n_month"
    echo "$n_month"
done

Output

02
03
04
05
06
07
08
09
10
11
12

관련 정보