yaml gitlab ci 中的 bash 丢失了变量

yaml gitlab ci 中的 bash 丢失了变量

需要帮忙

我正在学习 bash 和 gitlab

无法让它工作

gitlab管道.gitlab-ci.yml

variables:
    var1: test1
    var2: test2

stages:
  - build


build-job:   
  stage: build   
  script: 
    - |
      bash -s << EOF
      #!/bin/bash
      test1 () {
        echo $var1
        test3=$var1
      }
      test2 () {
        test1
        echo $var2
        echo $test3
      }
      
      test2
      EOF

'''

得到了错误的答案

'''

执行作业脚本的“step_script”阶段 00:00

$ bash -s << EOF # 折叠多行命令

测试1

测试2

作业成功

丢失变量测试3

'''

只是相同的 bash 脚本 test.sh

#!/bin/bash
test1 () {
echo $var1
test3=$var1
   }
test2 () {
test1
echo $var2
echo $test3
     }

test2

'''

$导出var1 =测试1 $导出var2 =测试2

$sh 测试.sh

得到了很好的答案这是正确的:

测试1 测试2 测试1

但 yaml 构造在函数之间丢失了变量 test3

我知道来自 gitlab ci 的 run test.sh,但我需要在 yaml 中以文本形式运行它,我该怎么做?

谢谢

答案1

正如中提到的我的答案对于您之前的问题,需要引用此处文档。如果不是,则在bash -c脚本运行之前,调用 shell 将执行变量的扩展(以及任何其他扩展)。

如果您还在脚本中对每个扩展加双引号,那就最好了bash -c

所以:

bash -s <<'END_SCRIPT'
test1 () {
    echo "$var1"
    test3=$var1
}
test2 () {
    test1
    echo "$var2"
    echo "$test3"
}
  
test2
END_SCRIPT

(请注意,由于您显式运行脚本bash,因此不需要#!- 行。)

如果您不在此处文档的开头引用此处文档分隔符,则为运行bash -c脚本而启动的 shell 将替换所有变量。假设var1和作为值和var2存在于环境中,将执行的脚本等效于以下内容:test1test2

bash -s <<END_SCRIPT
test1 () {
    echo "test1"
    test3=test1
}
test2 () {
    test1
    echo "test2"
    echo ""
}
  
test2
END_SCRIPT

相关内容