Bash星号省略以'.'开头的文件?

jot*_*t19 1 directory bash loops file

我正在使用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  
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 6

这不是循环省略那些文件,而是*shell 的扩展.如果你也想要dotfiles,请使用:

for item in .* *
Run Code Online (Sandbox Code Playgroud)

bash联机帮助页:

当模式用于路径名扩展时,除非设置了shell选项,否则"."必须明确匹配名称开头或紧跟斜杠后面的字符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
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,我只是坚持使用,.* *因为这是一个简单的解决方案.

  • 不要忘记`。*`将匹配当前目录和父目录`.`和`..`,这可能会导致问题,具体取决于您要执行的操作。 (2认同)

ray*_*ray 6

你可以设置 dotglob

shopt -s dotglob
for item in *; do echo "$item"; done
Run Code Online (Sandbox Code Playgroud)