【问题标题】:syntax error: unexpected end of file (expecting "fi")语法错误:文件意外结束(预期“fi”)
【发布时间】:2021-12-10 15:29:17
【问题描述】:

所以我有一个在 IF 语句中运行的简单脚本。我总是得到: 语法错误:文件意外结束(预期“fi”) 我想知道这可能是什么解决方案?

def call(Map config) {
    withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', credentialsId: 'JENKINS_AWS'],
      sshUserPrivateKey(credentialsId: 'JENKINS-SSH', keyFileVariable: 'SSH_KEY')]) {
        sh """
            #!/bin/bash
            source add_ssh_key "${SSH_KEY}"           
            source init_env "${TARGET_STAGE}"
            source create-bastion-pod "${PROMETHEUS_PUSHGATEWAY}" "${PROMETHEUS_PUSHGATEWAY_PORT}"  
            if [ ${TARGET_STAGE} == 'dev' ]; then
               cat <<-EOF | curl --data-binary @- \${BASTION_URL}/metrics/job/sone_job 
            # TYPE some_metric counter
            some_metric{label="val1"} 42 
            EOF
            fi
            delete-bastion-pod
        """
    }
}

【问题讨论】:

  • 结束分隔符似乎没有使用制表符缩进。基本上,解析器在解析 here 文档的同时看到脚本的结尾。
  • 三引号是怎么回事?这是在python中吗?
  • @WilliamPursell 一条现已删除的评论提到了 Groovy。
  • @JeffHolt 确实是的:)
  • curl 应该从sh 继承其标准输入,因此您可能可以使用cat ... | sh ...,但不清楚这是如何执行的。此外,似乎还有一个可能会造成严重破坏的杂散反引号。

标签: linux bash


【解决方案1】:

&lt;&lt;- 仅从 here-document 中删除 tabs;您的结束分隔符似乎是缩进的(根据 Groovy 实际呈现给 shell 的内容),带有几个空格。尝试类似

    sh """
        #!/bin/bash
        if [ ${TARGET_STAGE} == 'dev' ]; then
           cat <<EOF | curl --data-binary @- \${BASTION_URL}/metrics/job/some_job 
        # TYPE some_metric counter
        some_metric{label="val1"} 42 
        EOF
        fi
    """

请注意,就执行脚本的 shell 而言,here-document 和结束 EOF 根本没有缩进。

【讨论】:

  • 为了更清楚,我会将-EOF 更改为&lt;&lt;-EOF 与heredoc 的类型并不真正相关。
  • 确实,感谢您指出这一点。
  • 同样的问题!! ://
  • 你用什么来缩进脚本本身?如果您没有在每一行上使用相同类型的空格,那么您看到的可能不是 Groovy 实际传递给 shell 的内容。 (我正在考虑在每一行的开头混合空格和制表符。)
  • 我用整个 groovy 脚本编辑了原始帖子。请看一下——@chepner
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 2017-06-08
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多