如何访问bash中名称中有空格的环境变量?

时间:2013-08-27 14:34:07

标签: bash jenkins

运行env会返回“Clear Workspace = true”。如何在bash中访问它?仅供参考,它来自Jenkins参数化构建参数名称。 ${Clear Workspace}似乎不起作用。

另外,Jenkins甚至能够创建这个环境变量吗?在bash中运行Clear Workspace=true显然不起作用,因为它尝试运行带有“Workspace = true”参数的“Clear”命令。

我当然可以创建作业参数名称Clear_Workspace,但它以一种形式呈现给用户,所以我宁愿不这样做。此外,Jenkins的Maven Build Plugin有几个带空格的参数名称,因此必须以某种方式访问​​它们。

5 个答案:

答案 0 :(得分:9)

您可以使用env命令

模拟这一点乐趣
env Clear\ Workspace=true bash

这将为您提供一个具有环境变量集的shell。

让环境变量值退出的一种hacky方法是:

declare -p Clear\ Workspace | sed -e "s/^declare -x Clear Workspace=\"//;s/\"$//" 

除此之外,你需要使用本机代码程序或脚本语言来实现它,例如。

ruby -e "puts ENV['Clear Workspace']"

哪个不那么hacky ......如果你没有红宝石

perl -e 'print "$ENV{\"Clear Workspace\"}\n";'

python -c 'import os; print os.environ["Clear Workspace"]'

这是本机代码版本:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv, char **envp) 
{
  char **env;
  char *target;
  int len;
  if (argc != 2) 
  {
    printf("Syntax: %s name\n", argv[0]);
    return 2;
  }
  len = strlen(argv[1]);
  target = calloc(len+2,sizeof(char));
  strncpy(target,argv[1],len+2);
  target[len++] = '=';
  target[len] = '0';
  for (env = envp; *env != 0; env++) 
  {
    char *thisEnv = *env;
    if (strncmp(thisEnv,target,len)==0)
    {
      printf("%s\n",thisEnv+len);
      return 0;
    }
  }
  return 1;
}

答案 1 :(得分:0)

Jenkins可能正在创建除环境变量之外的某些

您不能在环境变量中包含空格。引用http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html

  

Shell中的实用程序使用的环境变量名称   IEEE Std 1003.1-2001的实用程序卷仅由大写字母组成   字母,数字和定义的字符的'_'(下划线)   在便携式字符集中,不要以数字开头。

答案 2 :(得分:0)

bash不是唯一可以操纵环境的语言:

$ perl -e '$ENV{"Clear Workspace"}="true"; system "env"' | grep Clear
Clear Workspace=true

如果你在shell中,你总是可以解析env的输出(未经测试)

value=$(env | while IFS="=" read -r var value; do
                  if [[ $var = "Clear Workspace" ]]; then
                      echo "$value"
                      break
                  fi
              done )

答案 3 :(得分:0)

Java支持将名称中带空格的环境变量传递给进程。这是一个证明它的例子:

给定/ tmp / test

#!/bin/sh
env > /tmp/test.out

和Test.java

import java.util.*;
import java.io.*;

public class Test {
    public static void main(String[] args) throws Exception     {
        ProcessBuilder pb = new ProcessBuilder("/tmp/test");
        Map<String, String> env = pb.environment();
        env.put("a b", "true");
        pb.directory(new File("/tmp"));
        Process p = pb.start();
    }
}

运行

> javac Test.java
> java Test
> grep "a b" /tmp/test.out 
a b=true

Jenkins uses the same functionality to start processes

你可以从纯shell访问那些,而不使用python,ruby等,但我不确定。我还没有实现它。

您可能希望将这些转换为不带空格的变量,因为它们具有更好的可移植性保证。

答案 4 :(得分:0)

以下命令将返回环境变量的值&#34; 清除工作区&#34;:

set | grep "Clear Workspace" | awk -F'=' '{print $NF}'

您可以分配给另一个没有空格的变量并用于您的目的:

export Clear_Workspace=\`set | grep "Clear Workspace" | awk -F'=' '{print $NF}'\`

试一试。