我创建了一个脚本,用于检查基本目录中是否存在.gz文件,如果找到它们,则根据当前日期将它们移动到新结构中。当shell设置为/ bin / bash并且我手动运行时脚本工作正常,但是这个脚本作为cron作业运行(通过logrotate),我相信它必须在/ bin / sh下运行,因为我不是确定如何让logrotate在/ bin / bash下运行它。有问题的代码是
# Move rotated logs to the archive
if [ -f $BASEDIR/*.gz ]; then
logger "$SNAME Moving rotated logs to $DIRECTORY"
mv $BASEDIR/*.gz $DIRECTORY
else
echo "$BASEDIR/*.gz"
logger "$SNAME No rotated logs to move. Is this normal?"
fi
在bash中,条件检查工作得很好,在sh下抱怨有太多的参数。如果我把东西放在引号中,它就不会看到通配符,而且会返回false。
任何帮助都会很棒!
答案 0 :(得分:0)
此处的问题是[ -f pathname ]
只使用一个名称([ -f one.gz two.gz ]
不是valid test
syntax),但您不知道有多少名称{ {1}}扩展为。
*.gz
打破这个局面:
check() {
set -- "$BASEDIR"/*.gz
if [ -f "$1" ] || [ -L "$1" ]; then
logger "$SNAME Moving rotated logs to $DIRECTORY"
mv -- "$@" "$DIRECTORY"
else
echo "$BASEDIR/*.gz"
logger "$SNAME No rotated logs to move. Is this normal?"
fi
}
check
定义了一个名为check() { ... }
的函数,我们稍后会调用它。check
替换函数的参数列表(这就是我们使用函数的原因,因此我们不会覆盖整个脚本的参数列表!),其中包含名称以{{1}结尾的文件列表}。set -- "$BASEDIR"/*.gz
测试此列表中的第一个名称是否存在 - 如果存在,则我们知道扩展成功。如果glob成功扩展但第一个条目是不存在的文件的符号链接,则*.gz
也可以为true;通过加入它,我们将涵盖那个角落案例。[ -f "$1" ]
重复使用该参数列表传递给[ -L "$1" ]
。 mv -- "$@" "$DIRECTORY"
参数指定mv
所有后续参数都是名称,即使它们以--
开头。答案 1 :(得分:0)
这个怎么样:
if ls "$BASEDIR"/*.gz
then
echo "moving them ..."
else
echo "No such file!"
fi