0

シェルスクリプトに次のコードがあります。これは、関数で定義されていない場合にのみ機能するようです。問題のある行は、「<<」を含む行です。エラーメッセージは

「./run: 210 行目: 構文エラー: 予期しないファイルの終わり」

関数内でこれを正しく記述するにはどうすればよいですか?

init_database()
{
    cd ../cfg
    db.sh << ENDC
    $DB_ADMIN

    0
    y
    n
    ENDC

    check_status

    sqlplus $DB_SCHEMA@$DB_NAME < initial_data.sql

    cd -
}
4

3 に答える 3

5

その問題を解決する方法はいくつかあります。

1/ 次のように、ヒア ドキュメントの終了マーカーのインデントを解除します。

cat <<EOF
    hello
    $PWD
EOF

しかし、それではコードが見苦しくなります。

2/ヒアドキュメントの開始マーカーを「インデント」します。

cat <<' EOF'
    hello
    $PWD
    EOF

ここで、最初の EOF の前のビットは、2 番目の前のビットとまったく同じです (タブ、4 つのスペース、2 つのタブなど)。これにより、適切なインデントを維持できますが、ヒアドキュメント内の変数は展開され$PWD ません (変化しません)。

3/ 入力行の開始点と終了マーカーからタブを削除できるようにします。

cat <<-EOF
    hello
    $PWD
    EOF

しかし、タブを行頭に入れる方法はありません。

4/ あなたの目的のために、以下も使用できます。

(   echo "$DB_ADMIN";
    echo "" ;
    echo "0" ;
    echo "y" ;
    echo "n"
) | db.sh
check_status
sqlplus $DB_SCHEMA@$DB_NAME < initial_data.sql
cd -

4番があなたにとって最良の選択肢だと思います。入力、タブ、スペースを行のどこにでも並べて配置し、変数を展開することができます。

于 2009-05-11T14:25:16.443 に答える