Сценарии Bash и gdal - как обращаться к элементам в переменной массива?

Я пытаюсь использовать gdal в сценарии bash. У меня есть несколько входных растровых файлов в формате ENVI в разных каталогах, и я хочу дать новые выходные имена в формате GTiff.

Затем идея состоит в том, чтобы запустить код в цикле, поэтому это всего лишь начальный тест, но он не хочет работать должным образом.

Это мой абстрактный код

#!/bin/bash

#Inputfiles a:
echo ${a[*]}
#/home/dir1/dir2/filename1 /home/dir1/dir4/filename2 /home/dir1/dir5/filename3

#outputnames b:
echo ${b[*]}
#outputname1 outputname2 outputname3


#this works, just to test
echo ${a[1]} ${b[1]} > file1.txt

#this works
gdal_translate –of GTiff /home/dir1/dir2/filename1 outputname1

#but this does not want to work? why?
gdal_translate –of GTiff ${a[1]} ${b[1]}

#error: Too many command options

Некоторый исходный код для цикла ниже, но приведенный выше 1-элементный тест еще не работает.

for i in ${a[*]}
do
   gdal_translate –of GTiff ${a[i]} ${b[i]}
done

Какие-либо предложения?


person spib    schedule 17.05.2013    source источник
comment
Что печатает echo "::${a[1]}::${b[1]}::"?   -  person ruakh    schedule 17.05.2013
comment
Он печатает: ::/home/bspies/hostshare/A_Data_PhD/A_Alldata/B_Cameroon2/cameroon2_output/Cameroon2_Dry_ASAR_20100424_SLC_0_VVVH_VH_2x4_15m/Cameroon2_Dry_ASAR_20100424_SLC_0_VVVH.cmli.utm_15m_VH::Cameroon2_Dry_ASAR_20100424_SLC_0_VVVH_VH_2x4_15m:: Это первые элементы обоих массивов, которые я сократил в примере выше.   -  person spib    schedule 21.05.2013


Ответы (2)


Для вашего цикла вы хотите перебирать каждый индекс массива. Код for i in ${a[*]} перебирает каждый элемент массива a. Вот что вы на самом деле хотите:

for i in ${!a[@]}; do
    gdal_translate –of GTiff "${a[$i]}" "${b[$i]}"
done

Это предполагает, что индексация одинакова в каждом массиве. Обратите внимание, что я заключил ${a[$i]} и ${b[$i]} в кавычки, чтобы элементы с пробелами передавались команде как один аргумент. Я предполагаю, что именно поэтому единственная команда gdal_translate –of GTiff ${a[1]} ${b[1]} выдает ошибку «слишком много параметров команды».

person Christopher Neylan    schedule 17.05.2013
comment
Спасибо @Christopher-Neylan за указатель @ vs *. Однако он по-прежнему дает ту же ошибку too many command options. даже с одной строкой gdal_translate –of GTiff "${a[1]}" "${b[1]}" Может быть, это связано с форматом моих входных массивов? Я немного поиграю, но любые предложения по-прежнему приветствуются! - person spib; 21.05.2013

Чтобы закрыть этот вопрос, я сделал это. Я нашел обходной путь для этой ситуации:

  1. Все мои файлы были в отдельных папках, поэтому мне пришлось их переместить в общую папку. Это было ключом к зацикливанию файлов.
  2. Затем, чтобы преобразовать все файлы ENVI в файлы .tif, я мог бы использовать

:

for filename in *.img;
do
    gdal_translate -of GTiff -a_nodata 0 $filename ../d_Separate_tif/$filename.tif
done

Я закрою этот вопрос сейчас.

person spib    schedule 16.07.2013