灰烬是否与bash的'nullglob'选项相当?

时间:2011-01-29 20:24:37

标签: bash shell scripting

如果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
~ # 

2 个答案:

答案 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 correctlycached

答案 1 :(得分:3)

这种方法比每次迭代检查存在更有效:

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

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

如果不匹配,参数列表包含单个元素,我们将其移除,以便参数列表现在为空。然后for循环根本不会执行任何迭代。

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