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)取消引用时不起作用