shell 如何在Gitlab CI yaml文件中创建用作脚本参数的数组变量?

aemubtdh  于 2023-01-02  发布在  Shell
关注(0)|答案(2)|浏览(257)

我试图弄清楚如何声明一个数组变量,并将其用作传递给shell脚本的参数,或者通过学习如何
下面是我尝试过的导致/bin/sh: eval: line X: syntax error: bad substitution的方法:

variables:
  EXTRA_ARGS: (. "${CI_COMMIT_SHORT_SHA} pipeline-${CI_PIPELINE_ID} latest" "pipeline-${CI_PIPELINE_ID}" $CI_COMMIT_REF_NAME $CI_COMMIT_REF_SLUG)

build:
  stage: build
  script:
    - path/to/script.sh uniqueParam1 uniqueParam2 ${EXTRA_ARGS[@]}
    - path/to/script.sh uniqueParam3 uniqueParam4 ${EXTRA_ARGS[@]}
    - path/to/script.sh uniqueParam5 uniqueParam6 ${EXTRA_ARGS[@]}

下面的代码运行得很好,但正如你所看到的,我重复了额外的参数:

build:
  stage: build
  script:
    - path/to/script.sh uniqueParam1 uniqueParam2 . "${CI_COMMIT_SHORT_SHA} pipeline-${CI_PIPELINE_ID} latest" "pipeline-${CI_PIPELINE_ID}" $CI_COMMIT_REF_NAME $CI_COMMIT_REF_SLUG
    - path/to/script.sh uniqueParam3 uniqueParam4 . "${CI_COMMIT_SHORT_SHA} pipeline-${CI_PIPELINE_ID} latest" "pipeline-${CI_PIPELINE_ID}" $CI_COMMIT_REF_NAME $CI_COMMIT_REF_SLUG
    - path/to/script.sh uniqueParam5 uniqueParam6 . "${CI_COMMIT_SHORT_SHA} pipeline-${CI_PIPELINE_ID} latest" "pipeline-${CI_PIPELINE_ID}" $CI_COMMIT_REF_NAME $CI_COMMIT_REF_SLUG

我还尝试删除作为参数的.点,但错误仍然存在。
为了我的头脑,我试着在bash中运行这个概念,并成功地运行了如下:

#!/bin/bash

TEST1="Hello"
TEST2="human!"

ARGS=(. $TEST1 $TEST2 "${TEST2} ${TEST1}" "param1" "param2")

echo "${ARGS[*]}"

输出:

. Hello human! human! Hello param1 param2

还尝试将其放在脚本中,如:

script:
  - EXTRA_ARGS=(. "${CI_COMMIT_SHORT_SHA} pipeline-${CI_PIPELINE_ID} latest" "pipeline-${CI_PIPELINE_ID}" $CI_COMMIT_REF_NAME $CI_COMMIT_REF_SLUG)

也不管用:

/bin/sh: eval: line 92: syntax error: unexpected "("

也尝试逃脱\(,但没有工作。

l7mqbcuq

l7mqbcuq1#

正如第一条评论所指出的,这个问题与基于Alpine的Docker映像有关,该映像默认情况下具有bourne shell而不是bash。
https://gitlab.com/gitlab-org/gitlab-runner/issues/1758

q43xntqr

q43xntqr2#

下面的代码适用于同样的情况,只是有一点小的不同,我将数组定义为变量,而不是将其作为参数发送。
.getlab-ci.yml中,我导出了一个“string”变量,它包含由';'连接和分隔的元素(使用单引号,转义;):

build:
  stage: build 
  variables:
    ELMNT1: Value Has Spaces
    ELMNT2: Another Value Has Spaces
  script: 
    - export MY_ARR_STR=${ELMNT1}';'${ELMNT2}
    - shell my_script.sh

在脚本中,我将字符串转换为数组:
my_script.sh

ORIG_IFS="$IFS"
IFS=";" read -a MY_ARR <<< $MY_ARR_STR
IFS="$ORIG_IFS"
for index in "${!MY_ARR[@]}";
do
    echo "Array Element at index '$index' is '${MY_ARR[$index]}'"
done

输出为

Array Element at index '0' is 'Value Has Spaces'
Array Element at index '1' is 'Another Value Has Spaces'

相关问题