bash if 문 스크립트 단순화 및 병렬화

bash if 문 스크립트 단순화 및 병렬화

디렉터리에서 파일을 찾고 if 문을 통해 파일을 소개하는 스크립트를 작성했습니다. 코드는 다음과 같습니다.

for dirname in /input/*; do

    id=${dirname#/input/}    # remove "/input/sub-"
    id=${id%/}             # remove trailing "/"

    printf 'Adding ID to recon-all processing list: %s\n' "${id}" >&2

    T11=`find /input/${id}/unprocessed/3T -name "*T1*MPR1*" -type f`
    T12=`find /input/${id}/unprocessed/3T -name "*T1*MPR2*" -type f`

    T21=`find /input/${id}/unprocessed/3T -name "*T2*SPC1*" -type f`
    T22=`find /input/${id}/unprocessed/3T -name "*T2*SPC2*" -type f`

    if [ -z "$T11" ] || [ -z "$T12" ] || [ -z "$T21" ] || [ -z "$T22" ]; then
        recon-all -s "${id}" -i "${T11}" -i "${T12}" -i "${T21}" -i "${T22}"
    elif [ -z "$T11" ] || [ -z "$T12" ] || [ -z "$T21" ]; then
        recon-all -s "${id}" -i "${T11}" -i "${T12}" -i "${T21}"
    elif [ -z "$T11" ] || [ -z "$T12" ] || [ -z "$T22" ]; then
        recon-all -s "${id}" -i "${T11}" -i "${T12}" -i "${T22}"
    elif [ -z "$T11" ] || [ -z "$T21" ]; then
        recon-all -s "${id}" -i "${T11}" -i "${T21}"
    elif [ -z "$T11" ] || [ -z "$T22" ]; then
        recon-all -s "${id}" -i "${T11}" -i "${T22}"
    else 
        recon-all -s "${id}" -i "${T11}" -i "${T21}" 
    fi

    if [ -e "/output/$subj_id" ]; then
        # no output file corresponding to this ID found,
        # add it to he list
        all_ids+=( "$subj_id" )
    fi
done

문제는 디렉토리 내에 다양한 조합이 있을 수 있고 때로는 T12와 T22가 누락될 수 있다는 것입니다. 이것이 바로 recon-all각 문에 대해 하나씩 만든 이유입니다. if 문을 단순화하고 이 스크립트를 병렬화하려면 어떻게 해야 합니까?

답변1

recon-all전화 하고 싶은지 궁금해서요null이 아닌 모든 변수. 이 경우 다음을 수행할 수 있습니다.

opts=( -s "$id" )
for val in "$T11" "$T12" "$T21" "$T22"; do
    [[ -n "$val" ]] && opts+=( -i "$val" )
done
recon-all "${opts[@]}"

관련 정보