在 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