我使用下面的脚本将超过一天的文件移动到其他目录,我只是用echo
语句检查它是否正常工作。
for i in `ls -lhrt | grep TRACK`
do
for j in `$i | awk '{print $7}'`
do
if [[ $j -lt $((`date | awk '{print $3}'` - 1)) ]];
then echo $j less than $((`date | awk '{print $3}'` - 1))
fi
done
done
但我看到一些错误,脚本运行不正常。如果我执行ls -lhrt | grep TRACK | awk '{print $7}'
,它可以正常工作并返回日期(数字字段)。
如果我修改脚本如:
for i in `ls -lhrt | grep TRACK | awk '{print $7}'`
do
if [[ $i -lt $((`date | awk '{print $3}'` - 1)) ]];
then echo $i less than $((`date | awk '{print $3}'` - 1))
fi
done
虽然工作正常。
我在原始脚本中错过的确切逻辑是什么?
答案 0 :(得分:2)
您的脚本假设第一个for循环(for i in ...
)在行上迭代,但该假设是错误的。如果在循环体中添加echo "$i"
,您将看到它对单词而不是行进行操作。
已经指出了下一个错误,就是在行
中for j in `$i | awk '{print $7}'`
脚本尝试执行变量$ i的内容。您想在此处添加echo
命令,如下所示:
for j in `echo $i ...
但当然这不会解决你的问题,因为$ i已经包含单个单词,并且awk没有第7个单词可以打印。
一个简单的解决方案(如果你坚持不使用find
)确实是你自己写的:
for i in `ls -lhrt | grep TRACK | awk '{print $7}'`
但是如果你想保留两个循环,可以在脚本中更改特殊变量IFS(内部字段分隔符),如下所示:
#!/bin/bash
OIFS="$IFS"
IFS="
"
for i in `ls -lhrt` ; do
IFS="$OIFS"
echo ">>$i<<"
for j in `echo $i|awk '{print $7}'` ; do
echo ">>$j<<"
done
done
在IFS="
分配在单行"
的下一行结束后,"
的行不包含任何内容,因此将换行符分配给IFS特殊变量。请务必在脚本中尽快恢复IFS。 (如果你没有这样做,你将从shell中获得非常混乱的行为,因为空格不再单独的单词......)
PS:您知道每次新月开始时您的脚本都会失败吗?
PPS:您知道您的脚本取决于当前的区域设置吗?在我的电脑上,这一行的第7个字在一年的这个时候是“Dez”,所以在运行脚本时我必须添加LANG=C
。
答案 1 :(得分:0)
刚看到你的更新
$i | ...
将尝试运行一个被调用的可执行文件,无论$i
的值是什么。在你的情况下,这将适用于$ i = 1,2和3(但不能做你想要的),否则就失败了。
您希望将字符串发送到管道中的下一个进程,而不是按该名称运行可执行文件。你需要做
echo $i | ...