ash 是否有相当于 bash 的“nullglob”的功能?选项?

发布于 2024-10-14 19:37:05 字数 495 浏览 2 评论 0原文

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

If a glob pattern doesn't match any files, bash will just return the literal pattern:

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

You can modify the default behavior by setting the nullglob shell option so if nothing matches, you get a null string:

bash-4.1# shopt -s nullglob
bash-4.1# echo nonexistent-file-*

bash-4.1# 

So is there an equivalent option in ash?

bash-4.1# ash
~ # echo nonexistent-file-*
nonexistent-file-*
~ # shopt -s nullglob
ash: shopt: not found
~ # 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

七月上 2024-10-21 19:37:05

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

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 中的文件名和路径名:如何正确执行 (缓存)

For shells without nullglob such as ash and dash:

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

Source: Filenames and Pathnames in Shell: How to do it correctly (cached)

拔了角的鹿 2024-10-21 19:37:05

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

set -- nonexistent-file-*
[ -e "$1" ] || shift
for filename; do
    echo "$filename"
done

我们使用 set 将通配符扩展到 shell 的参数列表中。请注意,这将覆盖最初传递给脚本的任何位置参数($1$2、...)。即使全局模式以可能与其他 冲突的 +- 字符开头,特殊参数 -- 也能使其正常工作。否则设置 用法。

如果参数列表的第一个元素不存在,则 glob 不匹配任何内容。与将第一个结果与逐字 glob 模式进行比较不同,即使 glob 的第一个匹配项与 glob 模式相同的文件名也能正常工作。

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

否则,当变量名后面没有任何内容时(相当于“$@”中的 ),我们会循环遍历 glob 扩展成的参数列表,使用 for 的隐式行为code>,迭代所有位置参数)。

This method is more performant than checking existence every iteration:

set -- nonexistent-file-*
[ -e "$1" ] || shift
for filename; do
    echo "$filename"
done

We use set to expand the wildcard into the shell's argument list. Note this will overwrite any positional arguments ($1, $2, ...) originally passed to the script. The special argument -- makes it work even if the glob pattern would start with a + or - character that could conflict with other set usages otherwise.

If the first element of the argument list does not exist, the glob didn't match anything. Unlike comparing the first result with the verbatim glob pattern, this works correctly even if the glob's first match was on a filename identical to the glob pattern.

In case of no match, the argument list contains a single element, and we shift it off, so that the argument list is now empty. Then the for loop will not perform any iterations at all.

Otherwise, we loop over the list of arguments which the glob expanded into, using the implicit behavior of for when there is nothing after the variable name (being equivalent to in "$@", iterating through all positional arguments).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文