Shell脚本没有进入while循环。

时间:2013-05-31 06:27:54

标签: bash shell

#! /bin/sh

while [ ! -r '*.pdf' ]
do
        echo "No pdf files have been created in the last 5 mins."
        sleep 5
done

while [ -r '*.pdf' ]
do
    echo "The following pdf file(s) have been created in the last 5 mins:"
    find -mmin -5 -iname '*.pdf'
    sleep 5
done

任何想法为什么即使在最后5分钟内制作了一些.pdf,它也不会进入第二个循环? 可能非常错误的代码,非常感谢任何想法!

1 个答案:

答案 0 :(得分:3)

诊断

对于第一个循环,您有:

while [ ! -r '*.pdf' ]

测试条件是查找名为*.pdf的文件(没有通配符;精确命名为*.pdf的文件),因为您将名称包装在引号中。

对于第二个循环,您有:

while [ -r '*.pdf' ]

这也是寻找*.pdf(不是名称的全局)。因此,除非在不太可能的情况下存在名为*.pdf的文件,否则这些循环将无法按预期工作。

处方

您可以使用:

while x=( $(find -mmin -5 -iname '*.pdf') )
do
    if [ -z "${x[*]}" ]
    then echo "No pdf files have been created in the last 5 mins."
    else
        echo "The following pdf file(s) have been created in the last 5 mins:"
        print "%s\n" "${x[@]}"
    fi
    sleep 5
done

这使用数组赋值为您提供名称列表。它并不完美;如果文件名中有空格,你最终会破坏名字。修复并非完全无关紧要。但是,仔细选择"${x[*]}"从阵列中的名称制作单个字符串(如果有的话),我们可以测试新文件。找到新文件后,使用printf"${x[@]}"在单独的行中报告其名称,每行输出一个名称。