如何在bash中测试文件名扩展结果?

use*_*087 3 bash shell

我想在bash中检查目录是否有文件.我的代码在这里.

for d in {,/usr/local}/etc/bash_completion.d ~/.bash/completion.d
     do              
         [ -d "$d" ] && [ -n "${d}/*" ] &&                         

         for f in $d/*; do                                                                                                           
             [ -f "$f" ] && echo "$f" && . "$f"                        

         done                                                                                                                        
     done
Run Code Online (Sandbox Code Playgroud)

问题是"〜/ .bash/completion.d"没有文件.所以,$ d/*被认为是简单的字符串"〜/ .bash/completion.d/*",而不是空字符串,这是文件名扩展的结果.作为该代码的结果,bash尝试运行

. "~/.bash/completion.d/*" 
Run Code Online (Sandbox Code Playgroud)

当然,它会生成错误消息.

有谁能够帮我?

Mar*_*wis 6

如果设置了nullglob bash选项,则通过

shopt -s nullglob
Run Code Online (Sandbox Code Playgroud)

然后globbing将删除与任何文件都不匹配的模式.


小智 5

# 注意:仅使用 bash 内置命令
# 假设$d包含目录路径

shopt -s nullglob

# 将匹配的文件分配给数组
文件=(“$d”/*)

如果 [ ${#files[@]} -eq 0 ]; 然后
    echo '未找到文件。'
别的
    # 任何
菲

分配给数组还有其他好处,包括理想(正确!)地处理包含空格的文件名/路径,以及不使用子 shell 的简单迭代,如以下代码所示:

查找“$d”-输入 f |
阅读时;做
    # 处理$REPLY
完毕

相反,您可以使用:

对于“${files[@]}”中的文件;做
    # 处理$文件
完毕

好处是循环由主 shell 运行,这意味着循环中产生的副作用(例如变量赋值)对于脚本的其余部分是可见的。当然,如果性能是一个问题的话,它也会更快
最后,还可以在命令行参数中插入数组(无需拆分包含空格的参数):

$ md5sum fileA "${files[@]}" fileZ

您应该始终尝试正确处理包含空格的文件/路径,因为有一天,它们会发生!