У меня есть некоторые файлы (изображение-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
) и я не уверен, является ли мой код правильным или нет. Эксперты могли взглянуть?Спасибо
Как и в ответе @ 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
Конечно, все зависит от предпочтений. Эти и подобные структуры можно увидеть в в этом вопросе о переполнении стека .
Надеюсь, это поможет.
Ваш NIIFILES
объявлен как строка, а не как массив.
Предполагая, что в имени файла нет места, вы можете использовать:
NIIFILES=( "$INPUT_DIRECTORY"/*.nii )