shell 脚本将默认数字设置为两位数零作为前缀

shell 脚本将默认数字设置为两位数零作为前缀

在 shell 脚本中,我正在处理,一些加法过程将打印输出。如果是一位数,则必须添加零作为前缀。

这是我当前的脚本:

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仍打印单位数。如何设置默认 shell 输出应返回两位数?

或者有什么替代方法可以解决这个问题?

答案1

不要在要存储十进制值的变量中使用前导零,因为在各种上下文中,带有前导零的数字被解释为八进制。算术展开就是其中之一。以下代码失败:

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

虽然这个有效:

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

仅在打印结果时添加前导零。通过使用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需要数字时,它会将带有前导零的字符串解释为八进制数。所以这是你需要小心的另一个情况。例子:

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

这意味着printf %02d当您避免使用前导零时,虽然可以是一个解决方案,但如果您不这样做,它可能是一个错误。

答案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

相关内容