How can you access an environment variable that has a space in its name in bash?

bash is not the only language that can manipulate the environment:

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

If you're in a shell, you can always parse the output of env (untested)

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

You can simulate this bit of fun with the env command

env Clear\ Workspace=true bash

That will give you a shell with the environment variable set.

A hacky way, which should work up to bash 4.0, to get the environment variable value back out is:

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

Bash versions starting with 4.0 will instead return an error and are unable to extract such environment variables in that way.

Other than that you'd need to use either a native code program or a scripting language to pull it out, e.g.

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

Which is much less hacky... also if you don't have ruby

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

also

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

And here is a native code version:

#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;
}

Tags:

Bash

Jenkins