【问题标题】:Line error in shell scriptshell脚本中的行错误
【发布时间】:2010-10-25 07:14:05
【问题描述】:

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

【问题讨论】:

    标签: shell indentation heredoc


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 您也可以使用&lt;&lt;- 作为heredoc 运算符(而不是&lt;&lt;),这将允许在限制字符串上使用前导制表符(但不能使用前导空格)。
      【解决方案3】:

      ENDC 标签必须单独在一行中,前导/尾随空格不带空格。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-09
        • 1970-01-01
        • 2014-11-10
        • 2017-07-25
        • 1970-01-01
        相关资源
        最近更新 更多