1

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

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: value too large for base (error token is "09")

4

4 回答 4

2

问题在于以 0 开头的数字被解释为八进制数字,而 8 和 9 不在以 8 为基数的数字系统中,因此出现错误。

来自man bash

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

要解决此问题,请通过添加数字转换为 base-10,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
于 2013-09-16T10:58:15.060 回答
1

值为 01,02,03 的 for 循环可以通过 for i in 0{1,2,3,4,5,6,7,8,9} do echo $i done .... 所以当你使用 $我它将具有所需的值 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
于 2013-09-25T20:01:28.967 回答
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
于 2013-09-16T10:56:18.303 回答
0

尝试这个

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

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

于 2013-09-16T10:58:48.697 回答