【问题标题】:Read value from file using a shell script使用 shell 脚本从文件中读取值
【发布时间】:2017-09-01 09:40:44
【问题描述】:

我有一个 Jenkinsfile,我想从 shell 脚本中读取一些值。

文件的部分是

-- Jenkinsfile
stage ('Setup Vars') {
  switch(BRANCH_NAME) {
    case 'develop':
      env.ECHO_CHAMBER_BRANCH = 'develop'
      env.HENDRICKS_JS_INTEGRATION_BRANCH = 'master'
      env.FEATURES_BRANCH = 'master'
    break
    case 'master':
      env.ECHO_CHAMBER_BRANCH = 'develop'
      env.HENDRICKS_JS_INTEGRATION_BRANCH = 'master'
      env.FEATURES_BRANCH = 'master'
    break
    default:
      env.ECHO_CHAMBER_BRANCH = 'feature-branch'
      env.HENDRICKS_JS_INTEGRATION_BRANCH = 'feature-branch'
      env.FEATURES_BRANCH = 'feature-branch'
    break
  }
}

我需要在 case 语句的默认部分读取分配给 env.ECHO_CHAMBER_BRANCHenv.HENDRICKS_JS_INTEGRATIONenv.FEATURES_BRANCH 的值,因此在本例中,我希望为每个变量返回 feature-branch

使用 shell 脚本,如何获取这些值?

【问题讨论】:

    标签: git bash shell sed


    【解决方案1】:

    改进的case_to_var 脚本(使用“case_to_var 文件名”):

    #!/bin/sed -nf
    # Only look at lines ending in ':'
    /:$/{
        # remove leading `case`, spaces, and the ':', and save name.
        s/.* \|://g
        h
        # until the `break` line, recall name, append variable name, 
        # and make it shell-parsable.
        :foo g
            N
            y/./_/
            s/'//g
            s/ = /=/
            s/\n.*env//gp
            /break$/!b foo
    }
    

    case_to_var Jenkinsfile 的输出:

    develop_ECHO_CHAMBER_BRANCH=develop
    develop_HENDRICKS_JS_INTEGRATION_BRANCH=master
    develop_FEATURES_BRANCH=master
    master_ECHO_CHAMBER_BRANCH=develop
    master_HENDRICKS_JS_INTEGRATION_BRANCH=master
    master_FEATURES_BRANCH=master
    default_ECHO_CHAMBER_BRANCH=feature-branch
    default_HENDRICKS_JS_INTEGRATION_BRANCH=feature-branch
    default_FEATURES_BRANCH=feature-branch
    

    使输出 shell 可解析允许它被执行和使用;就像谨慎使用eval一样:

    eval $(case_to_var Jenkinsfile)
    echo $default_FEATURES_BRANCH $develop_FEATURES_BRANCH
    

    输出:

    feature-branch master
    

    单行版本:

    sed -n '/:$/{s/.* \|://g;h;:foo g;N;y/./_/;s/'"'"'//g;s/ = /=/;s/\n.*env//gp;/break$/!b foo}' Jenkinsfile
    

    【讨论】:

    • 谢谢,您介意在break 之后解释所有其他选项。我可以看到你已经删除了env.
    • 当变量有env时,它没有区别,可以删除。
    • 当你说小心使用eval时会有更安全的方法吗?或者这样可以吗?
    • 这里没问题。只要程序员知道eval 做了什么(即知道命令行如何解析文本),然后准确控制eval 中的内容,它就是安全且有用的。不使用eval 进行未经过滤的直接用户输入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 2021-08-31
    相关资源
    最近更新 更多