Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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/9/loops/2.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_Loops_For Loop_Filenames - Fatal编程技术网

文件掩码上的bash循环

文件掩码上的bash循环,bash,loops,for-loop,filenames,Bash,Loops,For Loop,Filenames,在文件掩码上执行for循环的正确方法是什么 例如,如果掩码没有扩展到任何文件,则循环不应运行;否则,它应该运行在它扩展到的所有文件上 naive方法的问题是,如果*没有扩展到任何内容,那么整个循环将运行一次,就好像*部分是文件名的实际部分,而文件名实际上并不存在一样。一种方法是: for f in abc*; do if [[ -f "$f" ]]; then # Do something with "$f" fi; done 这也将从列表中筛选出目录,这可能是您想要的,也可能不是您想要的

在文件掩码上执行for循环的正确方法是什么

例如,如果掩码没有扩展到任何文件,则循环不应运行;否则,它应该运行在它扩展到的所有文件上

naive方法的问题是,如果*没有扩展到任何内容,那么整个循环将运行一次,就好像*部分是文件名的实际部分,而文件名实际上并不存在一样。

一种方法是:

for f in abc*; do if [[ -f "$f" ]]; then
  # Do something with "$f"
fi; done
这也将从列表中筛选出目录,这可能是您想要的,也可能不是您想要的

如果要保留目录,请使用-e而不是-f

另一种方法是设置shell选项nullglob可能在所有bash版本上都不可用。设置了nullglob后,与任何文件名都不匹配的模式将不会产生任何结果,而不会被更改

shopt -s nullglob
for f in abc*; do
  # do something with $f
done
shopt -u nullglob
这将在for循环的持续时间内设置nullglob。您可以在循环内取消设置它,而不必等待结束,在每个循环上执行shopt-u的成本很小。

一种方法是:

for f in abc*; do if [[ -f "$f" ]]; then
  # Do something with "$f"
fi; done
这也将从列表中筛选出目录,这可能是您想要的,也可能不是您想要的

如果要保留目录,请使用-e而不是-f

另一种方法是设置shell选项nullglob可能在所有bash版本上都不可用。设置了nullglob后,与任何文件名都不匹配的模式将不会产生任何结果,而不会被更改

shopt -s nullglob
for f in abc*; do
  # do something with $f
done
shopt -u nullglob
这将在for循环的持续时间内设置nullglob。您可以在循环内取消设置它,而不必等待结束,只需在每个循环上执行shopt-u即可。使用nullglob shell选项将不匹配的通配符展开为零,而不是返回通配符本身:

shopt -s nullglob
for file in abc*
do
    ...
done
使用nullglob shell选项使不匹配任何内容的通配符展开为零,而不是返回通配符本身:

shopt -s nullglob
for file in abc*
do
    ...
done

文件掩码?你是说一个通配符模式吗?@codeforester一个老问题不应该是一个新问题的重复。@cnst这不是一个一般规则,请看@cnst:我选择了答案最好的,而不是基于时间的。问题的年龄应该无关紧要。文件掩码?你是说一个通配符模式吗?@codeforester一个老问题不应该是一个新问题的重复。@cnst这不是一个一般规则,请看@cnst:我选择了答案最好的,而不是基于时间的。问题的年龄不重要。我认为-f也会过滤掉symlinks@cnst:TIAS太短,不能作为注释。但是,无论如何,指向文件的符号链接是-fi think-f也会过滤掉的symlinks@cnst:TIAS太短,不能作为注释。但是,无论如何,指向文件的符号链接是-f