将Month String转换为Integer Shell

时间:2012-06-26 14:53:36

标签: bash shell date openssl certificate

好吧所以我运行openssl命令来获取过期脚本的日期。这样做给了我:

enddate=Jun 26 23:59:59 2012 GMT

然后我把所有东西都切掉了,然后离开这个月是“君”

现在,我的脚本的下一部分是告诉用户证书是否已过期,为此我使用if语句,如下所示:

if [ $exp_year -lt $cur_year && $exp_month -lt $cur_month ]; then
    echo "" 
    echo "Certificate is still valid until $exp_date"
    echo "" 
else
    echo ""
    echo "Certificate has expired on $exp_date, please renew."
    echo ""
fi

我无法弄清楚如何将月份转换为整数甚至进行比较。 我想过做蛮力的方式就是这样:

Jan=01
Feb=02
Mar=03
...
显然,这是一种可怕的方式。有谁知道我能做什么?

2 个答案:

答案 0 :(得分:5)

好吧,你可以使用:

now=$(date +%s)
cert=$(date --date="$enddate" +%s)
if [ $cert -lt $now ]; then
   echo "Old!"
fi

即。将日期转换为超过纪元的秒数​​并比较那些

答案 1 :(得分:3)

我建议使用Petesh的答案,但如果你有Bash 4,这里有一种设置关联数组的方法:

months=(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
declare -A mlookup
for monthnum in ${!months[@]}
do
    mlookup[${months[monthnum]]=$((monthnum + 1))
done

echo "${mlookup["Jun"]}"    # outputs 6

如果你在版本4之前有Bash,你可以使用AWK来帮助你:

month=Feb
awk -v "month=$month" 'BEGIN {months = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"; print (index(months, month) + 3) / 4}'

纯Bash(任何版本)的另一种方式:

months="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"
month=Aug
string="${months%$month*}"
echo "$((${#string}/4 + 1))"