while循环bash脚本

时间:2014-03-06 15:48:00

标签: bash shell

我有一个包含以下信息的文本文件:

/media/Arc/eo_archive_test/MODIS/L2_LAC_OC/A2006001071000.L2_LAC_OC.x.hdf:2006:365
/media/Arc/eo_archive_test/MODIS/L2_LAC_OC/A2006001084000.L2_LAC_OC.x.hdf:2013:011
/media/Arc/eo_archive_test/MODIS/L2_LAC_OC/A2006001084500.L2_LAC_OC.x.hdf:2005:365
....

我想回复$ f1,其中$ f2是“2013”​​而$ f3是“011”。我正在使用以下脚本,但它回应所有。我在这做错了什么?

file=/media/Arc/eo_archive_test/MODIS/input/all_file_list.txt
while IFS=: read -r f1 f2 f3
do
    [ "$f2" = "2013" ] || [ "$f3" = "011" ]
    echo $f1
done < "$file"

任何解决方案? 提前谢谢

5 个答案:

答案 0 :(得分:2)

您需要将测试连接到操作

[[ $f2 == 2013 && $f3 == 011 ]] && echo $f1

if [ "$f2" = "2013" ] && [ "$f3" = "011" ]; then
    echo $f1
fi

您现在正在执行的是执行测试命令并忽略退出状态。所以echo命令确实为每一行执行。

答案 1 :(得分:1)

您必须在if句子中加入比较,并使用&&代替||,例如:

file=/media/Arc/eo_archive_test/MODIS/input/all_file_list.txt
while IFS=: read -r f1 f2 f3
do
    if [ "$f2" = "2013" ] && [ "$f3" = "011" ]; then
        echo $f1
    fi
done < "$file"

答案 2 :(得分:1)

总是echo - $f1,无论线是否匹配。试试这个:

[[ "${f2}" == "2013" ]] && [[ "${f3}" == "011" ]] && echo "${f1}"

答案 3 :(得分:0)

这符合Awk的加工模型。

awk -F : '$2 == "2013" && $3 == "011" { print $1 }'  /media/Arc/eo_archive_test/MODIS/input/all_file_list.txt

如果您想要一个正则表达式,那就像$3 ~ /^00[1-7]$/那样完成,或者您可以进行数字比较$3 > 0 && $3 <= 7

答案 4 :(得分:0)

......如上所述,我能够自动化部分需求;需要更多帮助,这是代码......

file=/media/Arc/eo_archive_test/MODIS/input/all_file_list.txt
while IFS=: read -r f1 f2 f3
do
for year in "2006" "2007" "2008" "2009" "2010" "2011" "2012" "2013"
do
[[ $f2 == $year ]] 
for doy in "001" "002" "003" "004" "005" "006" "007" # here we need some automation; seeking help
do
[[ $f3 == $doy ]] && echo $f1 >> test.txt
done
done
done < "$file"