처리 중인 쉘 스크립트에서 일부 추가 프로세스가 출력을 인쇄합니다. 한 자리 숫자인 경우 접두사로 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