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



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

此外,Jenkins是如何创建这个环境变量的?在bash中运行Clear Workspace=true显然不起作用,因为它试图运行参数为"Workspace=true"的"Clear"命令。

当然,我可以将作业参数命名为Clear_Workspace,但它是以表单的形式呈现给用户的,所以我宁愿不这样做。此外,Jenkins的Maven Build插件有几个带空格的参数名称,因此必须能够以某种方式访问它们。

您可以用env命令模拟这一点乐趣

env Clear Workspace=true bash

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

恢复环境变量值的一种方法是:

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

从4.0开始的Bash版本将返回一个错误,并且无法以这种方式提取此类环境变量。

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

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

这就不那么让人生气了。。。如果你没有ruby

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 namen", 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("%sn",thisEnv+len);
      return 0;
    }
  }
  return 1;
}

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 )

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

给定/tmp/测试

#!/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使用相同的功能来启动流程。

然而,对于您从纯shell访问这些内容,而不使用python、ruby等,我不确定。我还没能做到。

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

以下命令将返回环境变量"清除工作区"的值:

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

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

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

试试看。

Jenkins可能正在创建环境变量之外的东西

环境变量中不能有空格。报价http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html:

Shell和中的实用程序使用的环境变量名IEEE Std 1003.1-2001公用工程卷仅包含大写字母定义的字符中的字母、数字和"_"(下划线)在可移植字符集中,并且不要以数字开头。

最新更新