Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux bash:设置数组env变量并从任何shell脚本中取消引用该变量失败_Linux_Bash_Environment Variables - Fatal编程技术网

Linux bash:设置数组env变量并从任何shell脚本中取消引用该变量失败

Linux bash:设置数组env变量并从任何shell脚本中取消引用该变量失败,linux,bash,environment-variables,Linux,Bash,Environment Variables,我以这种方式将数组设置为环境变量 例如,脚本test.sh #!/bin/bash echo ${STRING[0]} 在test.sh中 #!/bin/bash export STRING=( "str1" "str2" ) sourcetest.sh 现在在脚本test-1.sh中 #!/bin/bash echo ${STRING[0]} 回答什么都没有,只是一个空行, 然而,如果我试图在test.sh中设置STRING=“str1” 然后在test-1.sh中执行echo$STRI

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

#!/bin/bash
echo ${STRING[0]}
在test.sh中

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

现在在脚本
test-1.sh中

#!/bin/bash
echo ${STRING[0]}
回答什么都没有,只是一个空行, 然而,如果我试图在test.sh中设置
STRING=“str1”
然后在
test-1.sh
中执行
echo$STRING
,这样就可以了

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

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


有人能给我一些建议来纠正我的错误吗?

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

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

数组变量可能尚未导出

但是,我不知道很多人认为这是一个真实的bug。其他支持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

误解在于认为环境变量只由shell使用——它们不是。无法将任何属性(包括只读、整数和数组)导出到环境块中。环境变量可以通过任何语言、C、C++、Perl、java、Python、PHP等来读取。它们也存在于Windows上

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

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


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

从进程传递到其子进程的环境变量是非结构化字符串;不支持数组。您可以在Bash中演示这一点:

export x=foo
printenv x
输出
foo
。如果我现在使
x
成为一个数组

x=(foo bar)
printenv x
我们看不到任何输出(
x
未导出)。

表示通过bash脚本可以将数组作为env变量传递。它用于在bash命令中定义和取消引用数组,但在从bash脚本(ubuntu18.04)取消引用时不起作用