7

我以这种方式将数组设置为环境变量,例如。脚本test.sh

在 test.sh

#!/bin/bash
export STRING=( "str1" "str2" )

源测试.sh

现在在脚本中test-1.sh

#!/bin/bash
echo ${STRING[0]}

响应什么都不是,只是一个空行,而如果我尝试STRING="str1"在 test.sh 中设置并echo $STRING在中执行test-1.sh,则可以。

测试仅从 root 用户执行,现在如何将数组设置为 env 变量,以便我可以根据需要调用数组的元素?早些时候,我什至尝试过修改/etc/bashrc,但这也没有产生任何积极的结果。

我需要将数组设置为 env 变量,因为我可能需要编写许多脚本来使用这些变量设置。

任何人都可以向我提供建议以纠正我做错的地方吗?

4

5 回答 5

10

阅读精美的手册“错误”部分。

数组变量可能(尚未)被导出。

不过,我不知道有多少人认为这是一个实际的错误。其他支持 ksh 样式数组的 shell 也不允许导出它们。

您可以通过参数或变量或环境轻松地传递数组定义。虽然它通常不是很有用。

function f {
    unset -v "$2"
    typeset "$2"
    eval "${!1}"
    typeset -p "$2"
}

typeset -a a=(a b c)
myArr=$(typeset -p a) f myArr a
于 2012-12-31T10:46:32.183 回答
2

误解是认为环境变量仅由外壳使用 - 它们不是。不能将任何属性(包括只读、整数和数组)导出到环境块中。环境变量可以被任何语言读取,C、C++、Perl、Java、Python、PHP 等等。它们也存在于 Windows 上。

那么,另一种语言如何支持 Bash 特定属性呢?所有环境变量都转换为字符串,除了在 Bash 中根本不导出数组值。

Korn shell 将只导出第一个元素。ksh93 还进行了一些exec利用来保留导出到 Korn shell 子级的变量属性。

顺便说一句,对变量名使用大写被认为是不好的做法,因为它们可能与 shell 使用的那些冲突。此外,在 Bash 3 上,名称 STRING 在导出时存在问题(在 Bash 4 中已修复)。

于 2012-12-31T12:11:03.040 回答
1

从进程传递给子进程的环境变量是非结构化字符串;不支持数组。你可以在 Bash 中证明这一点:

export x=foo
printenv x

那输出foo。如果我现在导致x成为一个数组

x=(foo bar)
printenv x

我们看不到输出(x未导出)。

于 2017-05-18T11:17:06.830 回答
0

您试图将数组放入环境变量中,而环境变量只能是字符串。bash 没有正确序列化/反序列化数组的方法;手动进行。

于 2012-12-31T10:43:54.520 回答
0

表示尽管使用 bash 脚本可以将数组作为 env 变量传递。它适用于在 bash 命令中定义和取消引用数组,但在从 bash 脚本(ubuntu 18.04)取消引用时不起作用。

于 2019-09-16T13:48:23.773 回答