Bash for in循环,在没有找到文件时执行错误

sno*_*ake 2 bash file-extension for-in-loop

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

#!/bin/bash
for pic in "$INPUT"/*.pdf
do
    echo "found: ${pic}"
done
Run Code Online (Sandbox Code Playgroud)

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

发现:/home/.../input-folder/*.pdf

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

我在"$ INPUT"周围尝试使用和不使用引号.文件名和目录名中没有空格.

非常感谢你的想法.

Gor*_*son 6

这是预期的行为.根据bash手册页,在Pathname Expansion部分中:

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

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

如果设置了nullglob选项,并且未找到匹配项,则删除该单词.

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

#!/bin/bash
shopt -s nullglob
for pic in "$INPUT"/*.pdf
do
    echo "found: ${pic}"
done
Run Code Online (Sandbox Code Playgroud)

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