2

我有这个 bash“for in”循环,它在目录中查找 pdf 文件并提示它们(为示例而简化)

#!/bin/bash
for pic in "$INPUT"/*.pdf
do
    echo "found: ${pic}"
done

当 $INPUT 目录中有 pdf 文件时,此脚本运行良好,但是,当目录中没有 pdf 文件时,我得到:

找到:/home/.../input-folder/*.pdf

这是预期的行为吗?如何使用 for in 循环处理它?我需要使用 ls 还是 find ?

我试过在“$INPUT”周围加引号和不加引号。文件名和目录名中没有空格。

4

2 回答 2

6

这是预期的行为。根据bash 手册页,在路径名扩展部分:

分词后,除非设置了 -f 选项,否则 bash 会在每个单词中扫描字符 *、? 和 [。如果出现这些字符之一,则该词被视为一个模式,并替换为按字母排序的与该模式匹配的文件名列表。如果未找到匹配的文件名,并且未启用 shell 选项 nullglob,则单词保持不变。

因此,如果没有"$INPUT"/*.pdf找到匹配的 for,则循环将在模式本身上执行。但是在手册页的下一句话中:

如果设置了 nullglob 选项,但没有找到匹配项,则删除该单词。

那正是你想要的!所以就这样做:

#!/bin/bash
shopt -s nullglob
for pic in "$INPUT"/*.pdf
do
    echo "found: ${pic}"
done

(但请注意,这可能会以意想不到的方式改变其他事物的行为。例如,尝试运行shopt -s nullglob; ls *.unmatchedextension,看看会发生什么。)

于 2013-04-20T08:11:24.837 回答
1

我会像这样添加一个文件存在测试:

#!/bin/bash
if test -e `echo "$INPUT"/*.pdf | cut -d' ' -f1`
then
    for pic in "$INPUT"/*.pdf
    do
        echo "found: ${pic}"
    done
fi
于 2013-04-20T07:43:22.397 回答