无法在shell脚本中使用值为01,02,03的for循环

时间:2013-09-16 10:46:21

标签: shell

我无法在shell脚本中使用for循环,值为01,02,03 ... 我正在尝试使用代码 - :

m=`(date +"%d-%m-%Y") | awk -F '-' '{print $2}'`
d=`(date +"%d-%m-%Y") | awk -F '-' '{print $1}'`
limit=`expr $d - 2`
for (( i=$m;i>=01;i-=1 ));
do
 for(( j=$limit;j>=01;j-=1 ));
   do
    echo -e "$j-$i-2013"
   done
done

我的查询是文件格式为2013-09-01,2013-08-02 ....但我从循环得到的值是1,2,3,4,它与文件名不匹配。 我收到错误 - ; 实际上我必须在服务器上自动化日志文件。我希望该脚本将文件压缩到现在的日期-2天。     compress_log.sh:第6行:((:i = 09:对于base来说值太大了(错误令牌是“09”) 还

4 个答案:

答案 0 :(得分:2)

问题是从0开始的数字被解释为八进制数字,8和9不在base-8数字系统中,因此错误。

来自man bash

  

前导0的常量被解释为八进制数。领先   0x或0X表示十六进制。否则,数字采用表格   [base#] n,其中base是2到64之间的十进制数,表示 -   算术基数,n是该基数中的数字。如果#是   省略,然后使用基数10.

要解决此问题,请将10#添加到数字,转换为base-10,如下所示:

month=10#$(date +%m)
day=10#$(date +%d)

此外,如果您只需要月份,请使用date +%m。无需awk


更新:如果你想用零填充数字,请像这样使用printf

printf "%02d" $month

您更新的脚本将是:

m=10#$(date +%m)
d=10#$(date +%d)
limit=$(( d - 2 ))
for (( i=m;i>=1;i-- ))
do
 for(( j=limit;j>=1;j-- ))
 do
    printf "%02d-%02d\n" "$j" "$i"
 done
done

答案 1 :(得分:1)

for循环值为01,02,03可以通过for i in 0 {1,2,3,4,5,6,7,8,9}来实现echo $ i完成....所以当你使用$ i它将具有所需的价值01,02,03 .... 下面是我用过的脚本 - :

for i in 0{1,2,3,4,5}
   do
    for j in 0{1,2,3,4,5,6,7,8,9} 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
      do
  echo -e "$i,$j\n"
      done
  done

答案 2 :(得分:0)

试试这个:

m=`(date +"%d-%m-%Y") | awk -F '-' '{printf "%2d", $2}'`
d=`(date +"%d-%m-%Y") | awk -F '-' '{printf "%2d", $1}'

让你的awk得到整数格式

如果这是您尝试实现的目标,也可以在for循环中进行更改

for (( i=$m;i>=1;i-=1 ));
do
  for(( j=$limit;j>=1;j-=1 ));
  do
    result=`expr $j - $i`
    echo $result
  done
done

答案 3 :(得分:0)

试试这个

m=`(date +"%d-%m-%Y") | awk -F '-' '{printf "%02d", $2}'`
d=`(date +"%d-%m-%Y") | awk -F '-' '{printf "%02d", $1}'`

如果输入是单个数字,则%2将返回空格,而%02将在此情况下附加0