bash - 无法获取 azure 管道中变量内的变量值

标签 bash azure azure-devops yaml azure-pipelines

我正在尝试在 azure 管道中的变量内使用变量。 下面是 bash 脚本的示例:

#!/bin/bash

customer=google
environment=preprod
android_google_preprod_account_activation_url=preprod.google.com

echo "Customer is $customer"
echo "Environment is $environment"

var1=android_${customer}_${environment}_account_activation_url

echo "variable is $var1"
echo "original value is ${!var1}"

当我在 Ubuntu 服务器上运行上述 bash 脚本时,我得到了预期的输出,没有错误:

Customer is google
Environment is preprod
variable is android_google_preprod_account_activation_url
original value is preprod.google.com

azure 管道的 yml 代码是:

parameters:
  - name: customer
    displayName: 'select customer'
    type: string
    values:
      - google
  - name: environment
    displayName: 'select environment'
    type: string
    values:
      - preprod

variables:
  - group: android-${{ parameters.customer }}-${{ parameters.environment }}
  - name: var1
    value: android-${{ parameters.customer }}-${{ parameters.environment }}-account-activation-url

script: |
      echo "Customer is $(customer)"
      echo "Environment is $(environment)"
      echo "variable is $(var1)"
      echo "original value is $(!var1)"
    displayName: 'echo variables'

android-google-preprod-account-activation-url 的值是从库内的变量组中获取的。

第四行出现错误:

invalid indirect expansion

前 3 行输出符合预期。

预期输出是:

Customer is google
Environment is preprod
variable is android_google_preprod_account_activation_url
original value is preprod.google.com

azure 管道中是否需要遵循不同的语法?

最佳答案

宏语法“$(varName)”是 Azure Pipelines 中用于插入变量值的专有语法。它在运行时处理,与 Bash 脚本中的语法“${varName}”不同。

对于您的情况,您可以尝试使用编译时语法“${{variables.varName }}”来获取管道中的值。

echo "original value is $(${{ variables.var1 }})"

通过上述更改,触发管道后:

  • 在编译时,表达式“${{variables.var1 }}”将替换为实际值“android_google_preprod_account_activation_url”。因此,表达式“$(${{variables.var1 }})”将更改为“$(android_google_preprod_account_activation_url) ”。
  • 然后在运行时,表达式将被解析为正确的值“preprod.google.com”。

下面是我自己测试过的示例。

YAML
variables:
  android_google_preprod_account_activation_url: 'preprod.google.com'
  var1: 'android_google_preprod_account_activation_url'

jobs:
- job: A
  displayName: 'Job A'
  pool:
    vmImage: ubuntu-latest
  steps:
  - checkout: none
  - task: Bash@3
    displayName: 'Print variables'
    inputs:
      targetType: inline
      script: |
        echo "android_google_preprod_account_activation_url = $(android_google_preprod_account_activation_url)"
        echo "var1 = $(var1)"
        echo "original value = $(${{ variables.var1 }})"
结果

enter image description here

更多详情可以引用相关文档“Understand variable syntax”。

关于bash - 无法获取 azure 管道中变量内的变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74958796/

相关文章:

bash - 如何使用多个循环并将输出存储到多个变量?

azure - 将自定义 exe 上传到 Azure Devops 管道

linux - Bash 测试并执行目录模式是否存在

linux - 如何将 "-L"传递给 awk 脚本?

t-sql - 如何分析 Azure SQL 死锁?

.net - Azure Service Fabric - 使用自定义服务删除 Actor

azure - 无法从变量组(库)更新变量

c# - 从 azure devops 服务器下载文件将错误的数据写入文件

azure-devops - 如何从 Azure DevOps 中的 .vdproj 构建安装项目?

bash - awk:神秘的双行打印