shell脚本中的行错误

0 shell heredoc indentation

我在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 -
}
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 5

有很多方法可以解决这个问题.

1/Unindent这里的文档结束标记,例如:

cat <<EOF
    hello
    $PWD
EOF
Run Code Online (Sandbox Code Playgroud)

但这会让你的代码看起来很难看.

2 /"缩进"这里的文档开始标记:

cat <<' EOF'
    hello
    $PWD
    EOF
Run Code Online (Sandbox Code Playgroud)

第一个EOF之前的那个位与第二个之前的位完全相同(制表符,四个空格,两个制表符,等等).这允许你保持良好的缩进,虽然它不会扩展here-document中的变量($PWD 不会改变).

3 /允许从输入行和结束标记的开头剥离制表符.

cat <<-EOF
    hello
    $PWD
    EOF
Run Code Online (Sandbox Code Playgroud)

但是没有办法看到线条的开头.

4 /为了您的目的,您还可以使用:

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

我相信4号对你来说是最好的选择.它允许在行中的任何位置和变量扩展中很好地排列输入,制表符和空格.