I have some files (image-1.nii, image2.nii, etc.) in a folder (INPUT_DIRECTORY) which are inputs to a command, and the result files should be saved in two other directories (BIAS_DIRECTORY,SEGMENTATION_N4_IMAGES).
These are the command that I tried to write:
#!/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 I am getting error for this line for FILE in "${NIIFILES[@]}"; do (error:Bad substitution) and I am not sure whether my code is correct or not. Could experts please have a look? Thanks
2 Answers
Similar to @oliv's response, you need to declare it as an array. A safer way to declare it as an array is this:
declare -a NIIFILES=( "$INPUT_DIRECTORY"/*.nii ) It gives slightly more control over the content in that it marks it unquestionably as an array to the next developer to see it.
A more shorthand way, or if space may later become a problem (from too many files/folders in the tree) you could use:
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 Of course, it's all up to preference. These and similar structures can be seen in this stackoverflow question.
Hope this helps.
Your NIIFILES is declared as a string and not as an array.
Assuming file don't have space in their filename, you could use:
NIIFILES=( "$INPUT_DIRECTORY"/*.nii ) 0