我想在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)
当然,它会生成错误消息.
有谁能够帮我?
如果设置了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
您应该始终尝试正确处理包含空格的文件/路径,因为有一天,它们会发生!