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_Conditional Statements - Fatal编程技术网

Bash脚本:检查循环中的多个文件条件

Bash脚本:检查循环中的多个文件条件,bash,loops,conditional-statements,Bash,Loops,Conditional Statements,我正在编写一个bash脚本,如果目录中有扩展名文件:jpg、jpeg或png,则可以执行一些操作。但当我尝试用for或while循环检查时,我把事情搞砸了 while [ filename in $IMAGE_DIR/*.jp*g -o filename in $IMAGE_DIR/*.png ] ; do # do something here 但我收到编译错误: 第30行:[:参数太多 我尝试了以下循环,但没有成功 for (filename in $IMAGE_DIR/*

我正在编写一个bash脚本,如果目录中有扩展名文件:jpg、jpeg或png,则可以执行一些操作。但当我尝试用for或while循环检查时,我把事情搞砸了

while [ filename in $IMAGE_DIR/*.jp*g -o filename in $IMAGE_DIR/*.png ] ; do
        # do something here
但我收到编译错误:

第30行:[:参数太多

我尝试了以下循环,但没有成功

for (filename in $IMAGE_DIR/*.jp*g) || (filename in $IMAGE_DIR/*.png); do
while [ filename in $IMAGE_DIR/*.jp*g ] || [ filename in $IMAGE_DIR/*.png ] ; do
while [[ filename in $IMAGE_DIR/*.jp*g ]] || [[ filename in $IMAGE_DIR/*.png ]] ; do
while [[ filename in $IMAGE_DIR/*.jp*g ] || [ filename in $IMAGE_DIR/*.png ]] ; do
while (( filename in $IMAGE_DIR/*.jp*g )) || (( filename in $IMAGE_DIR/*.png )) ; do
while ( filename in $IMAGE_DIR/*.jp*g )) || (( filename in $IMAGE_DIR/*.png ) ; do
我这里缺少什么?

您使用的是readarray而不是.txt,只需输入您想要的扩展名即可

readarray FILES <<< "$(find . -name "*.txt")";
for file in ${FILES[@]}; do
    echo $file
done  
您使用的是readarray而不是.txt,只需放置您想要的任何扩展名即可

readarray FILES <<< "$(find . -name "*.txt")";
for file in ${FILES[@]}; do
    echo $file
done  

以下是我认为迭代多类型文件扩展名更容易的方法。我希望您知道如何继续,您可以在for循环中创建if条件

$ ls -l
-rw-rw-r--  1 lucas lucas    0 Sep 25 13:58  test.jpeg
-rw-rw-r--  1 lucas lucas    0 Sep 25 13:58  test.jpg
-rw-rw-r--  1 lucas lucas    0 Sep 25 13:58  test.png
-rwxrwxr-x  1 lucas lucas   62 Sep 25 13:59  test.sh

$ cat test.sh 
#!/bin/bash
for i in *.jpg *jpeg *.png; do
  echo "hi $i"
done

$ ./test.sh 
hi test.jpg
hi test.jpeg
hi test.png

以下是我认为迭代多类型文件扩展名更容易的方法。我希望您知道如何继续,您可以在for循环中创建if条件

$ ls -l
-rw-rw-r--  1 lucas lucas    0 Sep 25 13:58  test.jpeg
-rw-rw-r--  1 lucas lucas    0 Sep 25 13:58  test.jpg
-rw-rw-r--  1 lucas lucas    0 Sep 25 13:58  test.png
-rwxrwxr-x  1 lucas lucas   62 Sep 25 13:59  test.sh

$ cat test.sh 
#!/bin/bash
for i in *.jpg *jpeg *.png; do
  echo "hi $i"
done

$ ./test.sh 
hi test.jpg
hi test.jpeg
hi test.png

为什么不做点什么*.jpg*.jpeg*.png?如果没有,你什么也不做。或者使用find-name*.jpeg或任何其他你想要的模式作为它们的名称,并将它们添加到你的工作中。没有理由检查周围的所有文件名,shell会用一个命令或一个glob为你提供这些文件。如果目录中有扩展名文件还是要迭代这些文件?如果这是重复的?@KamilCuk:只想迭代这些文件。为什么不做一些事情?*.jpg*.jpeg*.png如果没有,你将什么也不做。或者使用find-name*.jpeg或任何其他你想要的模式作为它们的名称,并将它们标记到你的工作中。没有理由更改它们检查周围的所有文件名,shell通过一个命令或一个glob为您提供这些文件。如果目录有扩展名文件,您想做些什么,或者您想迭代这些文件吗?如果这是重复的?@KamilCuk:只想迭代这些文件。这不是用*.txt编写文件的更复杂的方法吗?这是一个lso下放到子目录中,可能需要也可能不需要。这难道不是在*.txt中编写文件的更复杂的方法吗?它也下放到子目录中,可能需要也可能不需要。echo hi$我可以防止分词和文件名中的特殊字符出现问题。@BenjaminW。你说得对。我会改进示例,不是吗如果没有shopt-s nullglob,您将在没有文件存在的情况下获得模式。我建议……;如果[!-e$I];然后继续;fi;…doneecho hi$我将防止出现分词和文件名中特殊字符的问题。@BenjaminW。你说得对。我将改进示例,谢谢你没有shopt-s nullglob,你将在没有文件时获得模式。我建议……;如果[!-e$i];然后继续;fi;…完成