循环对象作为BASH,SHELL脚本中的输入

时间:2014-07-04 11:03:23

标签: bash shell loops sh

具有相同名称grid_200001.grb2.nc的多个文件,只有一个组件发生变化,即grid_200010.grb2.nc个月。我想将它们全部同时用作输入文件

我希望实现的一个例子是

fname="grid_"
year="2010"
month="01 02 03 04 05 06 07 08 09 10"
ext="grb2"
end="nc"

for((y=$year;y<=$year;y++));
do
    for m in $month
    do

    ifile=$fname$y$m.$ext.$end

    >>merge $ifile $ifile ... ofile 

我希望拥有的所需命令的例子是

 >> merge grid_200001.grb2.nc grid_200002.grb2.nc ....grid_200012.grb2.nc ofile

我希望所有可用的文件同时作为输入文件输入

3 个答案:

答案 0 :(得分:1)

fname="grid_"
years=({2000..2010})
months=(01 02 03 04 05 06 07 08 09 10)  ## ({01..10}) should be the same
ext="grb2"
end="nc"

shopt -s extglob
IFS='|' eval 'pattern="${fname}@(${years[*]})@(${months[*]}).${ext}.${end}"'
echo "pattern = ${pattern}"  ## for curiosity.
files=($pattern)  ## pathname expansion is sorted in Bash.

merge "${files[@]}" ofile

答案 1 :(得分:0)

你可以试试这个:

cat grid_2010[01][0-9].grb2.nc >> ofile

答案 2 :(得分:0)

我不确定我是否完全理解了这个问题(感谢您的评论编辑)

filenames=""

for year in $(seq 2000 2010)
do 
    for month in $(seq -w 0 10)
    do 
        filename="grid_"$year$month".grb2.nc"
        filenames=$filenames" "$filename
    done
done
your_command $filenames

这可能是你需要的? 猫和通配符很不错但会保持相同的顺序吗?

再次编辑: 但是,如果你只需要按升序排序,那么通配符的选择会更加简单your_command grid_20[01][0-9][01][0-9].grb2.nc(对于通配符总是这样吗?)