2

我编写了一个小 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' 并且在循环期间for filename in $DATA_DIRECTORY/$i_*_baboon*.csv;。但是,匹配没有像我预期的那样工作,并且每个(嵌套的 for 循环)都在循环目录中的所有文件——这不是我想要的。

如何根据文件名对文件进行模式匹配?

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

4

2 回答 2

6

${i}_而不是$i_因为$i_是“”(bash认为这i_是一个变量)。

例如:

for filename in $DATA_DIRECTORY/${i}_*_baboon*.csv; do
   echo "Processing file: $filename in loop: $i"
done
于 2012-06-28T08:32:15.330 回答
0

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

于 2012-06-28T08:34:43.427 回答