두 번째 배열의 요소를 제외하고 새로운 bash 배열을 만들어야 합니다. 그런 다음 while 루프에서 이 배열을 사용합니다.
while [ -n "${ids_toproc[0]}" ] ; do
구현 코드는 다음과 같습니다.
all_ids=( /input/sub-* )
all_ids=( "${all_ids[@]#/input/sub-}" )
all_ids=( "${all_ids[@]%/}" )
exist_ids=( /output/fmriprep/sub-*.html )
exist_ids=( "${exist_ids[@]#/output/fmriprep/sub-}" )
exist_ids=( "${exist_ids[@]%/}" )
exist_ids=( "${exist_ids[@]%%.*}" ) # delete extention
ids_toproc=( `echo ${all_ids[@]} ${exist_ids[@]} | tr ' ' '\n' | sort | uniq -u` )
코드에 문제가 있나요? 이렇게 비교하는 게 맞는 걸까요?
답변1
에 대한 후속 질문입니다.도커 내부의 쉘 스크립트".별도의 질문으로 올려주셔서 감사합니다!
배열 생성은 all_ids
디렉토리 이름에서 ID를 구문 분석하는 것보다 조금 더 복잡해야 하므로 여기서 할 수 있는 작업은 디렉토리의 파일 이름과 각 ID를 확인하는 루프를 사용하는 것입니다 /output/fmriprep
. 해당 ID에 대한 출력 파일을 찾을 수 없는 경우그 다음에all_ids
해당 ID가 목록 에 추가됩니다 .
all_ids=()
for dirname in /input/sub-*/; do
id=${dirname#/input/sub-} # remove "/input/sub-"
id=${id%/} # remove trailing "/"
if [ ! -e "/output/fmriprep/sub-$id.html" ]; then
# no output file corresponding to this ID found,
# add it to he list
all_ids+=( "$id" )
fi
done