未定義変数

未定義変数

このスクリプトを使用しようとしています。

#!/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 foreachis 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」エラーを発生させます。コピーして貼り付けたメッセージは正しいですか?

関連情報