Bash:如何将唯一无数据值列表转换为可以使用的变量?

时间:2018-03-30 20:26:05

标签: bash gdal

basepath=Desktop/DEM

dir=(ls -1 type -f)

cd $dir
for f in *.tif; do gdalinfo "$f" | grep -o 'NoData Value\=[-0-9]*' || echo "NoData Value=None"; done > test.txt
cat test.txt | sort | uniq > uniquenodata.txt #this is to find unique no data values in a directory 

nodatalist=$(cat uniquenodata.txt)
rightnodata=-9999

我已经制作了上面的BASH脚本,以找出目录中不同的无数据值。 我的目标是让单独的文件夹只有一种类型的无数据值,我需要以某种方式创建一个for循环,它将转换唯一无数据值列表($ nodatalist)并检查每个tif没有数据值并将其发送到具有这些无数据值的相应文件夹。我是BASH的新手,不知道如何将值列表转换为可以在for循环中使用的变量。

2 个答案:

答案 0 :(得分:0)

您可以使用变量间接,一个变量,其值是另一个变量的名称

for d in "${nodatalist[@]}"; do
    echo "${!d}"
done

如本例所示

declare -a a=("b" "c" "d");
b=1
c=2
d=3
for i in "${a[@]}"; do
   echo "name: $i, value: ${!i}"
done

输出:

name: b, value: 1
name: c, value: 2
name: d, value: 3

答案 1 :(得分:0)

更有效的方法是立即移动文件。如果目标目录不存在,请创建它。

for f in *.tif; do
    i=$(gdalinfo "$f" | grep -o 'NoData Value=[-0-9]*') && d=${i#NoData Value=} || d="None"
    mkdir -p "$d"
    mv "$f" "$d"/
done 

顺便说一下,这些行看起来像语法错误:

dir=(ls -1 type -f)
cd $dir

如果你有一个这个名字的目录,这将有效cd test。也许你的意思是find -type f,但这显然不会产生目录(-type f专门选择不是目录的常规文件。)