bash脚本无法按预期匹配文件

时间:2012-06-28 08:27:09

标签: bash ubuntu

我编写了一个小的bash *脚本来处理目录中的文件。这些文件具有特定的命名约定,用于确定文件的处理方式。

文件名以地理来源开头,然后在文件名中包含一个关键字,用于确定应如何处理。

这是我的脚本的精简版本:

DATA_DIRECTORY=./data

array=( 'uk' 'usa' 'fra' 'ukr' )

for i in "${array[@]}"
do
    echo "#################################################"
    echo "Loop index : $i"
    echo "#################################################"

    # process baboon data for the current country
    for filename in $DATA_DIRECTORY/$i_*_baboon*.csv; do
       echo "Processing file: $filename in loop: $i"
    done

    # process whale data for the current country
    for filename in $DATA_DIRECTORY/$i_*_whale*.csv; do
       echo "Processing file: $filename in loop: $i"
    done

    # process lion data for the current country
    for filename in $DATA_DIRECTORY/$i_*_lion*.csv; do
       echo "Processing file: $filename in loop: $i"
    done

done

我希望上面的脚本能够按以下方式匹配文件:名为 us_2007_deaths_caused_by_baboon.csv 的文件将被处理一次 - 当循环计数器变量为'us'时和循环期间{ {1}}。但是,匹配不能按预期工作,并且每个(嵌套for循环)循环遍历目录中的所有文件 - 这是 NOT 我想要的。

我如何根据文件名模式匹配文件?

*注意:我在Ubuntu 10.0.4上使用bash版本4.1.5

2 个答案:

答案 0 :(得分:6)

${i}_代替$i_,因为$i_是“”(bash认为此处i_是变量)。

例如:

for filename in $DATA_DIRECTORY/${i}_*_baboon*.csv; do
   echo "Processing file: $filename in loop: $i"
done

答案 1 :(得分:0)

尝试使用${i}代替$i,因为$i_*将被解析为变量i_而不是i