1

ディレクトリ内のすべてのテキスト ファイルの LOAD DATA IN ステートメントを 1 つの出力ファイルに生成しようとしています。ファイルは | で区切られます。または TAB があるので、head -1 $file コマンドで各ファイルをテストして、| が含まれているかどうかを確認することにしました。正しい負荷を出力しますが、実行されていません。case ステートメントは if ステートメントがなくても問題なく実行されるため、if ステートメントに絞り込みました。これはネストされた if ステートメントの正しい構文ですか?

 #!/bin/bash


    for file in *.txt

    do

    case $file in

    *_TEST1_*)

    firstLine=`head -1 $file`;

    if [[ $firstLine =~ "|" ]]
    then
    echo "LOAD DATA INFILE '/Data/"$file"' INTO TABLE testtable FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '' LINES TERMINATED BY '\n' ignore 1 lines;" >> output.txt;;
    else
    echo "LOAD DATA INFILE '/Data/"$file"' INTO TABLE testtable FIELDS TERMINATED BY '  ' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '' LINES TERMINATED BY '\n' ignore 1 lines;" >> output.txt;;
    fi

    *_TEST2_*)
    echo "LOAD DATA INFILE '/Data/ "$file"' INTO TABLE testtable2 FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '' LINES TERMINATED BY '\n' ignore 1 lines;" >> output.txt;;

    esac
    done

アップデート

同じ問題が発生した場合は、以下の私の回答をご覧ください。

4

1 に答える 1

1

問題は、二重セミコロンの配置でした。二重セミコロンは case ステートメントの終わりを指定するために使用されているため、case ステートメントは if ステートメントの前に閉じられていました。これを次のように変更したところ、動作するようになりました。

#!/bin/bash


    for file in *.txt

    do

    case $file in

    *_TEST1_*)

    firstLine=`head -1 $file`;

    if [[ $firstLine =~ \| ]]
    then
    echo "LOAD DATA INFILE '/Data/"$file"' INTO TABLE testtable FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '' LINES TERMINATED BY '\n' ignore 1 lines;" >> output.txt;
    else
    echo "LOAD DATA INFILE '/Data/"$file"' INTO TABLE testtable FIELDS TERMINATED BY '  ' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '' LINES TERMINATED BY '\n' ignore 1 lines;" >> output.txt;
    fi

;;

    *_TEST2_*)
    echo "LOAD DATA INFILE '/Data/ "$file"' INTO TABLE testtable2 FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '' LINES TERMINATED BY '\n' ignore 1 lines;" >> output.txt

;;

    esac
    done
于 2013-11-07T19:45:23.007 に答える