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

Bash: how to turn list of unique no data values into variables that can be used?

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 循环中使用的变量。

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

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

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

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 专门选择不是目录的常规文件)。