65. [Shell]将字符串转换为数字进行大小比较

65.1. 背景

有一个shell脚本中有这样一个代码段:

#!/bin/bash
py=`date +%Y`
pm=`date +%m`


if (( $pm  < 4 ));then
   py=$(( $py-1 ))
   pm=4
else
   pm=$(( ($pm-1)/3 ))
fi

其功能是获得当前日期的上一个季度的值,在运行时报错:

((: 08: value too great for base (error token is "08")

65.2. 解决

65.2.1. 原因分析

原因在于pm=date +%m解析得到的结果是08,这个结果值会被shell解析为8进制,08超出了8进制表示的范围,所以会报value too great for base。

65.2.2. 解决

将结果值转换为10进制即可,对脚本进行改造,使用10#标注于变量前。

#!/bin/bash
py=`date +%Y`
pm=`date +%m`


if (( 10#$pm  < 4 ));then
   py=$(( $py-1 ))
   pm=4
else
   pm=$(( (10#$pm-1)/3 ))
fi