我在文件夹(INPUT_DIRECTORY
)中有一些文件(image-1.nii、image2.nii 等),它们是命令的输入,结果文件应保存在另外两个目录中(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
(error: Bad substitution
),我不确定我的代码是否正确。专家可以帮我看一下吗?谢谢
答案1
与@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
当然,这完全取决于个人喜好。这些和类似的结构可以在这个 stackoverflow 问题。
希望这可以帮助。
答案2
您NIIFILES
被声明为一个字符串而不是一个数组。
假设文件的文件名中没有空格,您可以使用:
NIIFILES=( "$INPUT_DIRECTORY"/*.nii )