我正在使用bash脚本迭代目录中的所有文件。但循环正在跳过以'。'开头的文件。例如'.bashrc'我不确定.bashrc是否未通过文件测试或是否从通配符'*'中省略。我试过围绕“$ item”的双引号,但结果相同。如何使这个循环包含.bashrc文件?
id=0
cd $USERDIR
for item in *
do
if [[ -f $item ]]; then
cdir[$id]=$item
id=$(($id+1))
echo $item
fi
done
答案 0 :(得分:6)
这不是循环省略这些文件,它是shell *
的扩展。如果您还想要dotfiles,请使用:
for item in .* *
来自bash
联机帮助页:
当模式用于路径名扩展时,名称开头或紧跟斜杠后面的字符
"."
必须明确匹配,,除非shell选项{{1}已设置。
dotglob
选项上的最后一句可能看起来很有用,但您应该警惕更改可能影响以后代码的选项。使用它们最安全的方法是确保将它们设置回原始值,例如:
dotglob
但是,在这种情况下,我只是坚持使用rest_cmd=$(shopt -p dotglob) # Get restoration command
shopt -s dotglob # Set option
for item in * ; do
blah blah blah
done
${rest_cmd} # Restore option
,因为这是一个简单的解决方案。
答案 1 :(得分:2)
您可以设置dotglob
shopt -s dotglob
for item in *; do echo "$item"; done