2番目の配列の要素を除いて、新しい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