Использование цикла для объединения списка переменных с именами файлов - PullRequest
0 голосов
/ 26 сентября 2018

Я создал скрипт, который идентифицирует уникальный набор файлов (из большого списка) и сохраняет пути к файлам как уникальные переменные (например, $ vol1, $ vol2, $ vol3 ... см. Ниже).

for volume in `seq 1 $num_ap_files` 
    do
    bindex=$(cat ../b0_volumes_tmp.txt | head -$volume | tail -1)
    eval 'vol'${volume}=$(cat ../all_volumes.txt | head -$bindex | tail -1)
    done

Я хотел бы объединить переменные в одну строковую переменную для использования в качестве входных данных для отдельной программы командной строки.Поскольку количество томов может отличаться - кажется наиболее подходящим создать цикл следующего характера (определите, где у меня возникли проблемы):

??? files=$vol1
for i in `seq 2 $num_ap_files
do
??? eval files=${files}" $vol"${i) 
done

Я пробовал несколько различных вариантов здесьиспользуя файлы + =, функцию eval и т. д. и продолжайте получать сообщение об ошибке: -bash: vol0001.nii.gz: команда не найдена.Это можно обойти?Имена файлов должны быть в строковом формате, чтобы их можно было использовать на последующих этапах обработки.

Спасибо, Дэвид

1 Ответ

0 голосов
/ 26 сентября 2018

Используйте для этого массив:

vol=()
for ((volume = 1; volume <= num_ap_files; volume++)); do
    bindex=$(sed -n "$volume p" ../b0_volumes_tmp.txt)
    vol[$volume]=$(sed -n "$bindex p" ../all_volumes.txt)
done

files="${vol[*]}"

Переменная files содержит содержимое массива vol в виде одной строки.

Если вы хотите вызватькоманда с каждым элементом vol в качестве аргумента, нет необходимости использовать промежуточную переменную, такую ​​как files:

my_next_command "${vol[@]}"

Примечание: команда sed -n "$N p" file печатает N-ую строку файла (то же самоекак ваш cat file | head -$N | tail -1)

...