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"周围尝试使用和不使用引号.文件名和目录名中没有空格.
非常感谢你的想法.
这是预期的行为.根据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并查看会发生什么.)