我无法在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”) 还
答案 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