Плохая ошибка замены для выполнения удара управляет для многих файлов в папке в для цикла

У меня есть некоторые файлы (изображение-1.nii, image2.nii, и т.д.) в папке (INPUT_DIRECTORY) которые являются исходными данными к команде, и файлы результата должны быть сохранены в двух других каталогах (BIAS_DIRECTORY,SEGMENTATION_N4_IMAGES).

Это команда, которую я пытался записать:

 #!/bin/bash

INPUT_DIRECTORY=${PWD}/Images
OUTPUT_DIRECTORY=${PWD}/Output
BIAS_DIRECTORY=${PWD}/BIAS
SEGMENTATION_N4_IMAGES=${PWD}/N4

mkdir -p $OUTPUT_DIRECTORY
mkdir -p $BIAS_DIRECTORY
mkdir -p $SEGMENTATION_N4_IMAGES

N4=${ANTSPATH}/N4BiasFieldCorrection
N4_CONVERGENCE="[100x100x100x100,0.0000000001]"
N4_SHRINK_FACTOR=2
N4_BSPLINE_PARAMS="[200]"
DIMENSION=3

NIIEXT=".nii"
NIIFILES="($INPUT_DIRECTORY/*$NIIEXT)"

for FILE in "${NIIFILES[@]}"; do
    FILENAME="$(basename $FILE $NIIEXT)"
    ${N4} -d ${DIMENSION} -i ${FILENAME}.nii -s ${N4_SHRINK_FACTOR} -c ${N4_CONVERGENCE} -b ${N4_BSPLINE_PARAMS} -o ["(${SEGMENTATION_N4_IMAGES}/${FILENAME})".nii,"(${BIAS_DIRECTORY}/${FILENAME})".nii.gz] --verbose 1

done

Я получаю ошибку для этой строки for FILE in "${NIIFILES[@]}"; do (ошибка:Bad substitution) и я не уверен, является ли мой код правильным или нет. Эксперты могли взглянуть?Спасибо

0
задан 20 June 2018 в 10:21

2 ответа

Как и в ответе @ oliv, вам нужно объявить его как массив. Более безопасный способ объявить его в виде массива заключается в следующем:

declare -a NIIFILES=( "$INPUT_DIRECTORY"/*.nii )

Он дает немного больший контроль над контентом, поскольку он, несомненно, помечает его как массив для следующего разработчика, который его увидит.

Более кратким способом, или если пространство может позже стать проблемой (из-за слишком большого количества файлов / папок в дереве), вы можете использовать:

for FILE in "INPUT_DIRECTORY"/*.nii; do
  FILENAME="$(basename $FILE $NIIEXT)"
  ${N4} -d ${DIMENSION} -i ${FILENAME}.nii -s ${N4_SHRINK_FACTOR} -c ${N4_CONVERGENCE} -b ${N4_BSPLINE_PARAMS} -o ["(${SEGMENTATION_N4_IMAGES}/${FILENAME})".nii,"(${BIAS_DIRECTORY}/${FILENAME})".nii.gz] --verbose 1
done

Конечно, все зависит от предпочтений. Эти и подобные структуры можно увидеть в в этом вопросе о переполнении стека .

Надеюсь, это поможет.

1
ответ дан 20 June 2018 в 10:21

Ваш NIIFILES объявлен как строка, а не как массив.

Предполагая, что в имени файла нет места, вы можете использовать:

NIIFILES=( "$INPUT_DIRECTORY"/*.nii )
1
ответ дан 20 June 2018 в 10:21

Другие вопросы по тегам:

Похожие вопросы: