7

如果一个 glob 模式不匹配任何文件,bash将只返回文字模式:

bash-4.1# echo nonexistent-file-*
nonexistent-file-*
bash-4.1#

您可以通过设置 shell 选项来修改默认行为,nullglob因此如果没有匹配项,您将得到一个空字符串:

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
~ # 
4

2 回答 2

4

nullglob对于没有诸如 ash 和 dash的 shell :

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

资料来源:Shell 中的文件名和路径名:如何正确执行缓存

于 2011-01-29T21:12:31.680 回答
4

此方法比每次迭代检查是否存在更高效:

set q-*
[ -e "$1" ] || shift
for z; do echo "$z"
done

我们使用set将通配符扩展为 shell 的参数列表。如果参数列表的第一个元素不是有效文件,则 glob 不匹配任何内容。(与一些常见的尝试不同,即使 glob 的第一个匹配项是在名称与 glob 模式相同的文件上,这也能正常工作。)

在不匹配的情况下,参数列表包含单个元素,我们将其移出,因此参数列表现在为空。然后for循环将根本不执行任何迭代。

否则,我们循环遍历 glob 扩展到的参数列表(这是没有in elementsafter时的隐式行为for variable)。

于 2017-01-20T04:08:14.360 回答