在 for 循环中对文件夹中的许多文件运行 bash 命令时出现错误替换

在 for 循环中对文件夹中的许多文件运行 bash 命令时出现错误替换

我在文件夹(INPUT_DIRECTORY)中有一些文件(image-1.nii、image2.nii 等),它们是命令的输入,结果文件应保存在另外两个目录中(BIAS_DIRECTORYSEGMENTATION_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 )

相关内容