【问题标题】:How to pass a list of files with a particular extension in a for loop in bash如何在bash的for循环中传递具有特定扩展名的文件列表
【发布时间】:2015-08-30 12:00:50
【问题描述】:

首先,大家好,这是我在这里的第一篇文章。 我发誓我已经检查了该网站是否有类似问题,以避免“关于同一论点的双重帖子”问题,但他们都没有完全回答我的问题。 问题是,在下面的代码中,当我调用将扩展名作为第一个参数传递给它的脚本时,我总是收到"There are no files with this extension" 消息。

#!/bin/bash
if [ "$1" ];
    then
        file=*."$1";
        if [ -f "$file" ];
            then
                for i in "$file";
                [...do something with the each file using "$i" like echo "$i"]
            else
                echo "There are no files with this extension";
        fi;
     else
         echo "You have to pass an extension"
     fi;

我尝试使用双括号,在嵌套的 if 中使用和不使用引号,在 if 中直接使用*."$1",但这个解决方案都不起作用。

【问题讨论】:

    标签: bash argument-passing


    【解决方案1】:

    一个问题是,当您第一次为file 赋值时,您没有引用变量。在此声明中:

        file=*."$1";
    

    * 将由 shell 解释,因此例如,如果您在命令行中传入 .py,文件可能以 file1.py file2.py 的值结束,这将在稍后抛出您的文件存在测试.

    正如@sideshowbarker 指出的那样,另一个问题是您不能在[ -f ... ] 中使用通配符。

    另一个变量引用问题是引用禁止通配符扩展,因此即使没有文件存在测试,如果$file 是,例如*.txt,那么:

    for x in "$file"; do ...
    

    将循环使用文字值*.txt 的单个参数,而这个:

    for x in $file; do ...
    

    将循环遍历所有以 .txt 扩展名结尾的文件(除非没有,在这种情况下它将循环一次并将 $x 设置为文字值 *.txt)。

    通常,您会编写脚本以期待参数列表,并允许用户像 myscript *.txt... 那样调用它...也就是说,将通配符处理留给交互式 shell,让您的脚本处理一个列表的论点。那么就变成了简单的:

    for i in "$@"; do
      echo do something with this file named "$x"
    done
    

    如果你真的想在你的脚本中处理通配符扩展,这样的事情可能会起作用:

    #!/bin/bash
    if [ "$1" ];
        then
            ext="$1"
            for file in *.$ext; do
                [ -f "$file" ] || continue
                echo $file
            done
         else
             echo "You have to pass an extension"
         fi;
    

    [ -f "$file" ] || continue 语句是必要的,因为我前面提到的情况:如果没有文件,循环仍然会执行一次,并以 *.$ext 的字面扩展。

    【讨论】:

    • 只是另一个问题,在这种情况下,我可以在哪里输入echo "There were no file with this extension?我尝试将它放在done 之后,但似乎[ -f "$file" ] || continue 如果找不到匹配的文件,则脚本会完全停止。
    • 在我的示例中编写脚本的方式您不能轻易提供该错误。您可以在for 循环中维护匹配文件的计数,然后检查该计数是否为0
    • 我更新了我的答案以包含一个示例,该示例显示了如何添加 echo "There were no file with this extension" 位。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 2014-03-19
    • 2019-10-13
    • 2013-01-08
    • 1970-01-01
    • 2014-02-05
    相关资源
    最近更新 更多