0

我在 shell 脚本中有以下代码。这似乎仅在在函数中定义时才有效。有问题的行是包含“<<”的行。错误信息是

“./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 之前的位与第二个之前的位完全相同(制表符、四个空格、两个制表符等)。这使您可以保持良好的缩进,尽管它不会扩展 here-document 中的变量($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 回答
1

恐怕您的“此处文档”的结尾需要不缩进。

于 2009-05-11T14:19:48.030 回答
1

ENDC标签必须单独成一行,没有前导/尾随空格。

于 2009-05-11T14:21:04.533 回答