このスクリプトを使用しようとしています。
#!/bin/csh
foreach SUB (1 2 3 4 5 6 7 8 9 10 11 12 13 14)
echo $SUB
foreach VISIT (1 2 3 4 5 6 7 8)
echo $VISIT
grep 'StudyDate' -f /home/colourlab/Desktop/DrummingDTI/D${SUB}/D${SUB}V${VIS}/scout/001/infodump.dat
done
done
ただし、次のエラーメッセージが表示されるたびに:
1
1
SUB: Undefined variable.
理由はわかりません。
答え1
とは別にスクリプトを書いてはいけない理由csh
、スクリプトでbash構文とcsh構文を混在させています。
でループを開始しcsh
foreach
、ループを終了しようとしますbash
done
。 aのループ終了はcsh
foreach
is end
、is notですdone
。また、grep文でVISIT
呼び出される変数もあります。$VIS
したがって、スクリプトはcshで構文的に正確です。
#!/bin/csh
foreach SUB (1 2 3 4 5 6 7 8 9 10 11 12 13 14)
echo $SUB
foreach VISIT (1 2 3 4 5 6 7 8)
echo $VISIT
grep 'StudyDate' -f /home/colourlab/Desktop/DrummingDTI/D${SUB}/D${SUB}V${VISIT}/scout/001/infodump.dat
end
end
またはbashで:
#!/bin/bash
for SUB in 1 2 3 4 5 6 7 8 9 10 11 12 13 14; do
echo $SUB
for VISIT in 1 2 3 4 5 6 7 8; do
echo $VISIT
grep 'StudyDate' -f /home/colourlab/Desktop/DrummingDTI/D${SUB}/D${SUB}V${VISIT}/scout/001/infodump.dat
done
done
2017/04/03 修正
以下は、ファイルのテストを追加するbashスクリプトのバージョンです。
#!/bin/bash
idf_pfx="/home/colourlab/Desktop/DrummingDTI"
idf_sfx="scout/001/infodump.dat"
for SUB in 1 2 3 4 5 6 7 8 9 10 11 12 13 14; do
echo $SUB
for VISIT in 1 2 3 4 5 6 7 8; do
echo $VISIT
idfile="${idf_pfx}/D${SUB}/D${SUB}V${VISIT}/${idf_sfx}"
if [ -f "${idfile}" ]; then
grep 'StudyDate' $idfile
else
echo "No studydate file: $idfile"
fi
done
done
答え2
エラーメッセージが表示されたコードと一致しません。 $ SUBは明確に定義された変数であり、cshはそれをコピーしません。代わりに、cshは「Complete:command notfound」エラーを発生させます。コピーして貼り付けたメッセージは正しいですか?