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
Bash 如果文件名glob没有匹配项,如何不匹配_Bash_Glob_Shopt - Fatal编程技术网

Bash 如果文件名glob没有匹配项,如何不匹配

Bash 如果文件名glob没有匹配项,如何不匹配,bash,glob,shopt,Bash,Glob,Shopt,我想遍历所有匹配扩展名jpg或txt的文件。我使用: for file in myDir/*.{jpg,txt} do echo "$file" done 问题:如果目录根本不包含jpg文件,循环将有一次迭代,输出myDir/*.jpg。我认为*将被一个任意文件替换(如果没有文件存在,则无法扩展)。如何避免不必要的迭代?使用此选项可以避免不必要的迭代: shopt -s nullglob 从manbash: nullglob:如果设置,bash允许不匹配任何文件的模式(请参见上面的路径名

我想遍历所有匹配扩展名
jpg
txt
的文件。我使用:

for file in myDir/*.{jpg,txt}
do
  echo "$file"
done

问题:如果目录根本不包含jpg文件,循环将有一次迭代,输出
myDir/*.jpg
。我认为
*
将被一个任意文件替换(如果没有文件存在,则无法扩展)。如何避免不必要的迭代?

使用此选项可以避免不必要的迭代:

shopt -s nullglob
manbash

nullglob
:如果设置,bash允许不匹配任何文件的模式(请参见上面的路径名扩展)扩展为空字符串,而不是它们自己


请参阅:
help shopt
shopt

这两个问题和一个重复的问题不仅涉及路径名扩展,还涉及大括号扩展和POSIX请求的重复问题

compgen-G
执行
bash--posix
兼容的路径名扩展(无大括号扩展)和。。。您猜对了:如果没有匹配项,则不会产生任何结果


因此,编写一个
bash--posix
函数来实现它。简要概述:暂时使用
set-f
首先通过回显进行大括号扩展(无路径名扩展),然后对路径名扩展的每个结果应用
compgen-G
。完整函数留作练习。

如果模式没有匹配项,默认/POSIX行为是将模式视为文本字符串,而不是忽略或删除模式。与问题无关,但请注意大括号不是模式的一部分。它们是
bash
的简写,用于生成一组相关字符串,因此在模式匹配开始之前扩展到字符串
myDir/*.jpg myDir/*.txt