有几个问题可以解决问题,但我想尝试以下方法:
在这个问题中,我基本上将数组作为环境变量,然后尝试将字符串存储到单独的数组元素中。
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"')
环境变量是简单的字符串键值对。数组不能是环境变量。
但是,您可以将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)
| 归档时间: |
|
| 查看次数: |
69 次 |
| 最近记录: |