我有一个bash脚本,它将日期,月份和年份作为单独的参数。使用它,构建一个url,然后使用wget
获取内容并将其存储在html文件中(比如t.html)。现在,用户可以输入2位数的月/日(如02中而不是2,反之亦然)。如何区分上述两种格式并在脚本中对此进行更正?
网址的工作原理如下:
日期:需要输入2位数字。因此,必须提供一个7作为正确构建的URL的07。在这里,我正在寻找一个检查,如果它小于10并且前面没有零,则将日期附加零。因此,在构建url之前,7应该成为日期字段的07
月:需要输入2位数字,但此处网址会自动附加0以保存月份< 10.因此,如果用户输入2,则url形成02,但如果用户输入02,则url形成002.这里,可能需要附加或删除0。
P.S:我知道这个方法后跟url s * c& s,但我只需要使用它。
谢谢,
斯利拉姆
答案 0 :(得分:6)
有点不清楚你要求的是什么。如果您只想剥离一个前导零,那么这将做:
month=${month#0}
这会将02
变为2
,12
仍为12
。
如果您需要删除多个零(002
以上将转为02
),您需要做一些不同的事情,比如使用正则表达式
while [ -z "${month##0*}" ]; do month=${month#0}; done
或使用正则表达式,例如sed
month=$(sed -e 's/^0*//'<<<"$month")
HTH
修改的
根据你的编辑;如已经建议的那样,使用printf
month=$(printf %02d "$month")
这会将2
变为02
,12
保持不变,123
也是如此。如果你想强制一个两位数字,或者你没有printf
(这是一个内置于bash中的shell,通常也可以使用,那么机会很低),sed
可以再次帮助
month=$(sed -e 's/.*\(..\)$/\1/'<<<"00$month")
将前置两个零(002
)并保留最后两个字符(02
),同时将空字符串转换为00
。这也会将a
变为0a
。想一想,你不需要sed
来实现这个
month="00$month"
month="${month:0-2}"
(0-
需要消除默认值扩展的歧义)
答案 1 :(得分:2)
只需使用printf
。
例如$(printf "%02d" $day)
添加前导零以防万一
并$(printf "%1d" $month)
删除零,以防万一。
答案 2 :(得分:2)
剥离所有前导零,无论数字如何,无论最终数字是多少(例如,它都修复了“010”):
shopt -s extglob
month=009
month=${month##+(0)}
echo "$month"
演示:
$ for a in 2 02 002 0002 20 020 00200; do echo ${a##+(0)}; done
2
2
2
2
20
20
200
修正任何日期:
shopt -s extglob
fixdigits () {
if (( ${#1} > 2 || ${#1} < 1 ))
then
echo "Invalid number of digits"
return 1
fi
printf '%.2d\n' 0${1##+(0)}
}
演示:
$ for a in 2 02 002 0002 20 020 00200; do fixdigits $a; done
02
02
Invalid number of digits
Invalid number of digits
02
Invalid number of digits
Invalid number of digits
可替换地:
shopt -s extglob
fixdigits () {
digits=${1##+(0)}
if (( ${#digits} > 2 || ${#digits} < 1 ))
then
echo "Invalid number of digits"
return 1
fi
printf '%.2s\n' 0$digits
}
演示:
$ for a in 2 02 002 0002 20 020 00200; do fixdigits $a; done
02
02
02
02
02
02
Invalid number of digits