Bash

在 yaml gitlab ci 中從 bash 中失去變數

  • November 8, 2022

需要幫忙

我正在學習 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

作業成功

失去變數 test3

’''

相同的 bash 腳本 test.sh

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

test2

’''

$ export var1=test1 $ 導出 var2=test2

$sh 測試.sh

得到了很好的答案這是正確的:

測試1 測試2 測試1

但是yaml構造在函式之間失去了變數test3

我知道從 gitlab ci 執行 test.sh,但我需要在 yaml 中以文本形式執行它我該怎麼做?

謝謝

正如我對您上一個問題的回答中提到的,需要引用此處的文件。如果不是,則變數的擴展(以及任何其他擴展)將在bash -c腳本執行之前由呼叫 shell 執行。

如果您還雙引號在bash -c腳本中的每個擴展,那將是最好的。

所以:

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

(請注意,由於您bash顯式執行腳本,因此不需要#!-line。)

如果您沒有在 here-document 的開頭引用 here-document 分隔符,則為執行bash -c腳本而啟動的 shell 將替換所有變數。假設var1var2存在於環境中作為值test1test2,將執行的腳本將等效於以下內容:

bash -s &lt;&lt;END_SCRIPT
test1 () {
   echo "test1"
   test3=test1
}
test2 () {
   test1
   echo "test2"
   echo ""
}
 
test2
END_SCRIPT

引用自:https://unix.stackexchange.com/questions/724159