为什么环境变量不能是数组

如何获取到一个切片类型的环境变量?

标签:Go

地址:https://stackoverflow.com/questions/58191251/getting-a-slice-as-an-environment-variable

详情描述

我的一个需求,要将 bash 脚本转为 Go 编写。在 Bash 中,我从 env 环境变量中读取一个数组。

设置环境变量,如下。

$ export ARRAY1=(a b c d e)

脚本中如何使用。

echo ${ARRAY1[@]}

输出的结果。

a b c d e

数组是按我的意愿变化的。

现在,我想在 Go 中实现同样的效果。我可以通过如下的代码声明一个数组。

b := [5]int{a, b, c, d, e}

但数组是非动态的。于是,我想到了切片

[]string{"a", "b", "c", "d", "e"} 

但现在的问题是,通过 env 变量该如何传递呢?

优秀回答

mkopriva 的评论

可以使用 os.Getenv 获取环境变量的值,os.Getenv 的返回类型是 string,这个值由你决定如何解析,比如它是通过空格分隔的,可以用 strings.Split 根据空格切分。最终,你就能得到自己想要的切片。

补充,再看一个非常有参考价值的问题。

不能使用数组作为环境变量吗?

标签:Linux

地址:https://unix.stackexchange.com/questions/393091/unable-to-use-an-array-as-environment-variable

详情描述

不知道为什么我不能在脚本中使用数组类型的环境变量。

在我的 ~/.bashrc~/.profile 文件中。

export HELLO="ee"
export HELLOO=(aaa bbbb ccc)

在 shell 终端:

$ echo $HELLO
ee
$ echo $HELLOO
aaa
$ echo ${HELLOO[@]}
aaa bbbb ccc

在脚本中

#!/usr/bin/env bash
echo $HELLO
echo $HELLOO
echo ${HELLOO[@]}

输出

ee

为什么?

优秀回答

Kusalananda 的回答

Bash 中数组不能作为环境变量,环境变量必须是 key/value 的字符串对。

参考 shell 中 PATH 环境变量,它是一个路径数组。通过特定的分隔符实现了将数组转化成了字符串。我们可以采用同样的思路。

$ arr=( aa bb cc "some string" )
$ arr=$( printf '%s:' "${arr[@]}" )
$ printf '%s\n' "$arr"
aa:bb:cc:some string:

更加简洁的写法:

arr=( aa bb cc "some string" )
arr=$( IFS=:; printf '%s' "${arr[*]}" )
export arr

${arr[*]}arr 数组经过 IFS 分隔展开的结果,此处 IFS:。前后的两种方法是有区别的。第一种方法界定了每个元素的位置。而第二种方法只是分割了每个元素,也就是说,如此我们就无法确定最后一个元素是否为空。

另一个可选的方案,通过命令行传递环境变量参数,如下。

$ arr=( aa bb cc )
$ ./some_script "${arr[@]}"

脚本访问命令行参数的例子。

printf 'First I got "%s"\n' "$1"
printf 'Then  I got "%s"\n' "$2"
printf 'Lastly there was "%s"\n' "$3"

for opt in "$@"; do
    printf 'I have "%s"\n' "$opt"
done

Wildcard 的回答

数组是 bash 特有的。而环境变量需要是 name-value 键值对。

阅读 环境变量规范,其中有这样一段话。

The value of an environment variable is a string of characters. For a C-language program, an array of strings called the environment shall be made available when a process begins. The array is pointed to by the external variable environ, which is defined as:

extern char **environ;

These strings have the form name=value; names shall not contain the character ‘=’.