将一位数月份更改为两位数月份

将一位数月份更改为两位数月份

我有这个脚本:

day=`date +%d`
month=`date +%m`
year=`date +%Y`
lmonth=`expr $month - 1`
if test "$lmonth" = "0"
then lmonth=12
year=`expr $year - 1`
fi

我调用时的结果$lmonth/$year9/2012 如何让它输出09/2012

当月份为 10、11 或 12 时,我不希望它分别是 010、011 或 012。

当我调用带有句点的表或文件时,我想放入 $year 和 $lmonth。例如,table_extra201209。

如何为 1(一月)至 9(九月)的月份添加额外的零?

我尝试了这里的所有答案,但是嗯...我忘了提一些事情...当我调用带有句点的表或文件时,我想放入 $year 和 $lmonth,例如 table_extra201209,如何将其放在带有“0”的“9”之前...?再次感谢 :)

答案1

$ month=5; year=2012 
$ perl -e 'printf"%02d/%04d\n",@ARGV' $month $year
05/2012

我不记得 Bash 是否有 printf 或 sprintf 函数,它可能具有同等有用的东西。


是的,bash 可以

$ month=5
$ year=2012
$ printf "%02d/%04d\n" $month $year
05/2012

或者,如果您需要变量中的结果,请使用-v

$ printf -v expiry "%02d/%04d" $month $year
$ echo  $expiry
05/2012

此外,你不需要调用date那么多次

$ d=$(date '+%Y %m %d %H %M %S')
$ a=( $d )
$ echo ${a[0]}
2012
$ echo ${a[1]}
10
$ echo ${a[2]}
30
$ echo ${a[3]}
09
$ echo ${a[4]}
59
$ echo ${a[5]}
31

最后,date它本身往往能给你你想要的东西

$ minsec=$(date "+%M/%S")
$ echo $minsec
03/27

您可能知道这一点,但如果您减少月份,则必须允许 1 - 1 = 12,并减少年份并检查日期数是否在范围内(不是 2 月 31 日,不是 2 月 29 日,除非是闰年,允许在不同地区不同日期更改日历)。通常,最好使用具有良好日期处理模块的脚本语言。

答案2

您可以测试数字是否小于 10,并且只有当数字小于 10 时才0在数字前面添加一个。因此,尝试将以下内容附加到您的脚本中:

[ $lmonth -lt 10 ] && lmonth=0$lmonth

相关内容