我有一个 bash 脚本,列出目录中的所有文件:
for file in foo/*; do
echo ${file##*/}
done
如果目录中有文件,它工作正常,但如果没有文件,它会列出上一级目录的文件。
我怎样才能解决这个问题?
答案1
如果目录中没有任何内容foo
,则变量file
将获取文字值foo/*
。替换${file##*/}
将产生字符串*
,并echo
输出当前目录中的所有名称。
要解决此问题bash
,最简单的选择是使用 来设置nullglob
shell 选项shopt -s nullglob
。这可以确保如果没有与模式匹配的名称,文件名通配不会扩展到模式本身。
从bash
手册中:
nullglob
如果设置,
bash
则允许不匹配任何文件的模式(请参阅上面的路径名扩展)扩展为空字符串,而不是其自身。
诗。我希望手册使用“名称”或可能的“文件名”而不是“文件”。