将数组作为环境变量存储到非交互式 shell

Por*_*ine -1 shell bash array

有几个问题可以解决问题,但我想尝试以下方法:

在这个问题中,我基本上将数组作为环境变量,然后尝试将字符串存储到单独的数组元素中。

a=('Apple Tomato' 'Banana Carrot') bash -c \
'b=($(echo "${a}")); echo -e "${b[0]}\n"; echo "${b[1]}";'
Run Code Online (Sandbox Code Playgroud)

输出

(Apple

Tomato
Run Code Online (Sandbox Code Playgroud)

期望输出:

苹果番茄

香蕉胡萝卜

一个观察:

此外,如果原始数组在单引号数组元素内有双引号,是否会保留引号。例如:a=('Apple "Tomato"' 'Banana "Carrot"')

Kus*_*nda 5

环境变量是简单的字符串键值对。数组不能是环境变量。

但是,您可以将a数组的值传递给bash -c脚本:

bash -c 'printf "%s\n" "$@"' bash "${a[@]}"
Run Code Online (Sandbox Code Playgroud)

或者,如果您想b在脚本中调用数组:

bash -c 'b=( "$@" ); printf "%s\n" "${b[@]}"' bash "${a[@]}"
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,数组的元素a都在脚本的命令行上传递。这意味着,他们将在显示"$@"(在"$1","$2"等等)你里面bash -c的脚本。

您的问题中发生的事情是命令

a=('Apple Tomato' 'Banana Carrot') bash -c '...'
Run Code Online (Sandbox Code Playgroud)

将变量a设置为字符串(Apple Tomato Banana Carrot)。这是环境变量的值a的bash -c脚本:

$ a=('Apple Tomato' 'Banana Carrot') bash -c 'printf "%s\n" "$a"'
(Apple Tomato Banana Carrot)
Run Code Online (Sandbox Code Playgroud)

如果您确实需要将数据作为环境变量传递,您可以通过决定一个分隔符然后将数组展平为单个字符串来实现。

例如,使用 :

IFS=:
b="${a[*]}" bash -c 'set -f; IFS=:; a=( $b ); printf "%s\n" "${a[@]}"'
Run Code Online (Sandbox Code Playgroud)

这将构造字符串Apple Tomato:Banana Carrot并b使用此字符串作为bash -c脚本的值创建环境变量。

该脚本然后分割b上:一遍,并分配分头话自己的a阵列。

我需要set -f在脚本中使用以避免在使用不带$b引号的单词时调用文件名通配符。

然后你也想恢复原来的值IFS中均bash -c和母贝(你可能要存储在一个变量的旧值,以使它更容易些)。您可能还想在bash -c脚本中再次启用文件名通配,使用set +f.

ifs=$IFS; IFS=:
b="${a[*]}" bash -c 'set -f; ifs=$IFS; IFS=:; a=( $b ); IFS=$ifs; unset ifs; set +f; printf "%s\n" "${a[@]}"'
IFS=$ifs; unset ifs
Run Code Online (Sandbox Code Playgroud)