检查文件是否存在[SH]

时间:2017-06-21 15:07:08

标签: linux bash shell if-statement sh

我创建了一个脚本,用于检查基本目录中是否存在.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。

任何帮助都会很棒!

2 个答案:

答案 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