发出斩断系列字符串Bash与星号

时间:2013-11-26 16:20:04

标签: string bash bash-completion chop

我有一系列带有标准化名称的压缩文件(file1pop.zip,...,filenpop.zip)。在这些文件中,我有一个感兴趣的文件popdnamei.asc,其中i = {1,n}。我想对这些文件执行两个命令(其中将asc文件转换为tif)。但是,我无法让我的bash脚本工作。我想我不能正确理解如何在bash上打字。有谁知道我的错误是什么?

################### 
##  Choose path
###################
cd 
cd path/to/my/directory/with/zipfiles

###################
##  Unzip, convert to tif and project (WGS84)
###################

for x in *pop.zip
do
echo $x
files=${x%%.*}  #with this I hope to target the base name "filei", i={1,n} without the ".zip" extension
mkdir $files
    unzip -d $files  $x
y=popd*.asc  
if [ -f $files/$y ]  #with this I want to run my commands only if the file popdnamei.asc does exist in the file
then
        newy=${y%%.*}   #extract "popdnamei" without ".asc" extension
        gdal_translate $files/$y $files/$newy.tif  #command 1
        gdalwarp -s_srs "WGS84" -t_srs "WGS84" $files/$newy.tif $files/$newy_PROJ.tif  #command 2
        cp $files/$newy_PROJ.tif ../Output_Storage/ 
fi
rm -rf $files
done    

我认为变量$y存在问题。我在程序运行时检查了输出文件,字面上用星号命名为“newypopd*.tif”而不是用“已完成”名称(popdnamei.tif)命名。此外,没有文件写入我的Output_Storage目录。我认为我很难用一个用星号定义的变量来完成,我并不完全理解它是什么。有人能帮助我吗? 谢谢。

1 个答案:

答案 0 :(得分:2)

问题在于声明

 y=pop*.asc

bash文件名扩展功能尝试查找给定文件名模式的匹配项。如果未找到匹配项,则将提供的模式分配给变量。在您的情况下,解压缩的pop * .asc文件位于子文件夹$ files中,因此找不到匹配项,并且将模式本身分配给变量“y”。

我建议使用另一个内循环来迭代解压缩的文件。

for y in $files/pop*.asc; 
do
        if [ -f $y ]
        then 
            newy=${y%%.*}   #extract "popdnamei" without ".asc" extension
            gdal_translate $y $newy.tif  #command 1
            gdalwarp -s_srs "WGS84" -t_srs "WGS84" $newy.tif $newy_PROJ.tif  #command 2
            cp $newy_PROJ.tif ../Output_Storage/ 
        fi
done