Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash星号忽略以';开头的文件';?_Bash_File_Loops_Directory - Fatal编程技术网

Bash星号忽略以';开头的文件';?

Bash星号忽略以';开头的文件';?,bash,file,loops,directory,Bash,File,Loops,Directory,我正在使用bash脚本迭代目录中的所有文件。但是循环正在跳过以“.”开头的文件,例如“.bashrc”。我不确定.bashrc是否未能通过文件测试,或者是否从通配符“*”中省略。我尝试过在“$item”周围加双引号,但结果相同。如何使此循环包含.bashrc文件 id=0 cd $USERDIR for item in * do if [[ -f $item ]]; then cdir[$id]=$item id=$(($id+1))

我正在使用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  
这不是省略这些文件的循环,而是shell对
*
的扩展。如果还需要点文件,请使用:

for item in .* *
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

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

您可以设置
dotglob

shopt -s dotglob
for item in *; do echo "$item"; done

伟大的此处的详细信息:不要忘记,
*
将匹配当前目录和父目录,
,这可能会导致问题,具体取决于您尝试执行的操作。@Keith:是的,在这种情况下不是这样,因为它使用
-f
进行过滤,只处理文件,但是我以前一直被无限循环所困扰,因为我一直在处理
“子目录”:-,这似乎解决了我在这里遇到的具体问题。在shopt手册页中:“如果设置了dotglob,bash会在路径名扩展的结果中包含以“.”开头的文件名。”但是我必须在使用shopt后取消其设置吗?@user3143122,不,您不应该取消其设置。你应该按照我回答的后半部分把它恢复到以前的值。在最初设置时将其取消设置与在最初取消设置时将其保留一样糟糕。如果在bash脚本中设置
dotglob
,则该设置仅适用于脚本,不会影响shellsettings@paxdiablo,明白了,最好还是回到原来的样子。但据我所知,默认值是未设置的。更改它是否会影响shell本身,或者只是shopt在我的脚本中的行为?看起来我的问题已被取消脚本:)