在bash脚本中区分2和02

时间:2011-02-09 08:32:51

标签: bash scripting command-line-arguments wget

我有一个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,但我只需要使用它。

谢谢,
斯利拉姆

3 个答案:

答案 0 :(得分:6)

有点不清楚你要求的是什么。如果您只想剥离一个前导零,那么这将做:

month=${month#0}

这会将02变为212仍为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变为0212保持不变,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