循环遍历无法正常工作的目录中的文件

时间:2017-10-05 08:27:45

标签: bash

考虑这个简单的脚本:

#!/bin/bash
DIR="$1"

for f in "$DIR"; do
    if [[ "$f" == "*.txt" ]];
    then
        echo "Filename is $f"
fi
done

我想只返回扩展名为.txt的文件。使用以下命令调用脚本:

./script1 /home/admin/Documents

什么都不返回。没有错误,只是空白。有什么问题?

1 个答案:

答案 0 :(得分:8)

我假设你希望遍历你传递的目录中的所有文件。为此,您需要更改循环:

for file in "$1"/*

值得一提的是for没有任何内置行为来枚举目录中的项目,它只是迭代你传递它的单词列表。由shell扩展的*导致循环遍历文件列表。

您的情况也需要修改,因为*需要引号之外(其余部分也不需要在其中):

if [[ $f = *.txt ]]

但是你可以通过直接循环遍历以.txt结尾的所有文件来避免对条件的需要:

for file in "$1"/*.txt

你可能还想考虑没有匹配的情况,在这种情况下我猜你期望循环不运行。在bash中这样做的一种方法是:

# failing glob expands to nothing, rather than itself
shopt -s nullglob 

for file in "$1"/*.txt
    # ...
done

# unset this behaviour if you don't want it in the rest of the script
shopt -u nullglob