shell脚本中的行错误

时间:2009-05-11 14:16:58

标签: shell indentation heredoc

我在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 -
}

3 个答案:

答案 0 :(得分: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号是您的最佳选择。它允许在行中的任何位置和变量扩展中很好地排列输入,制表符和空格。

答案 1 :(得分:1)

你的“Here document”的结尾需要不缩进,我很害怕。

答案 2 :(得分:1)

ENDC标签必须在没有前导/尾随空格的行中单独存在。