如果glob模式与任何文件都不匹配,bash
将只返回文字模式:
bash-4.1# echo nonexistent-file-*
nonexistent-file-*
bash-4.1#
您可以通过设置nullglob
shell选项来修改默认行为,这样如果没有匹配,则会得到一个空字符串:
bash-4.1# shopt -s nullglob
bash-4.1# echo nonexistent-file-*
bash-4.1#
ash
中是否有等效选项?
bash-4.1# ash
~ # echo nonexistent-file-*
nonexistent-file-*
~ # shopt -s nullglob
ash: shopt: not found
~ #
答案 0 :(得分:3)
对于没有nullglob
的炮弹,如灰烬和破折号:
IFS="`printf '\n\t'`" # Remove 'space', so filenames with spaces work well.
# Correct glob use: always use "for" loop, prefix glob, check for existence:
for file in ./* ; do # Use "./*", NEVER bare "*"
if [ -e "$file" ] ; then # Make sure it isn't an empty match
COMMAND ... "$file" ...
fi
done
来源:Filenames and Pathnames in Shell: How to do it correctly(cached)
答案 1 :(得分:3)
这种方法比每次迭代检查存在更有效:
set q-*
[ -e "$1" ] || shift
for z; do echo "$z"
done
我们使用set
将通配符扩展到shell的参数列表中。如果参数列表的第一个元素不是有效文件,则glob不匹配任何内容。 (与一些常见的尝试不同,即使glob的第一次匹配是在名称与glob模式相同的文件上,这也能正常工作。)
如果不匹配,参数列表包含单个元素,我们将其移除,以便参数列表现在为空。然后for
循环根本不会执行任何迭代。
否则,我们遍历glob扩展到的参数列表(这是in elements
之后没有for variable
时的隐式行为。