Shell-以大写形式导出变量名称

时间:2019-01-15 13:19:34

标签: bash shell docker continuous-integration

我有一个从docker调用的ci脚本。它用于在运行测试之前定义几个变量。这些变量的名称取决于ci配置中的另一个变量。

export ${VAR_FROM_CI_CONF^^}_FIRST_TEST_VAR="test"
export ${VAR_FROM_CI_CONF^^}_SECOND_TEST_VAR="test2"

在本地它可以工作,但是运行ci我得到syntax error: bad substitution错误。似乎无法成功地将bash样式解释为大写。

我需要替换它,所以如果VAR_FROM_CI_CONF是“ hi”,它将导出我:

export HI_FIRST_TEST_VAR="test"
export HI_SECOND_TEST_VAR="test2"

谢谢

2 个答案:

答案 0 :(得分:1)

我建议将您容器中的默认外壳从/bin/sh(或其他)更改为/bin/bash

这可以通过Dockerfile中的SHELL ["/bin/bash", "-c"]命令来完成。因此,您将获得所有在bash中执行的后续脚本命令,这些命令对^^宏有很好的了解。

答案 1 :(得分:1)

自从您提到docker以来,我猜您可能有一个未安装bash的容器(它是Alpine吗?),并且您的脚本是使用内置的string^^执行的。

无论如何,我相信您使用的$ apk add --no-cache bash $ bash $ HELLO=hi ; echo ${HELLO^^} => HI 语法要求bash 4.0及更高版本,因此您将需要安装bash。

如果您使用的是Alpine Linux:

Dockerfile

然后您应该走上正轨。

当然,如果您控制RUN apk add --no-cache bash ,请使用以下命令将软件包安装添加到其中:

#!/usr/bin/env bash
# ...

并在您的脚本中添加一个shebang,以确保使用bash执行该脚本:

public void Home1_Loaded(object sender, RoutedEventArgs e)
{
    bdgb.Visibility = Visibility.Collapsed;
}