如何将数组作为变量从第一个 bash shell 脚本传递到第二个脚本。
首先.sh#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
sh second.sh "$AR" # foo
sh second.sh "${AR[@]}" # foo
第二个.sh
#!/bin/bash
ARR=$1
echo ${ARR[@]}
在这两种情况下,结果都是foo
。但我想要的结果是foo bar baz bat
。
我做错了什么以及如何解决它?
答案1
AFAIK,你不能。您必须序列化它并反序列化它,例如通过参数数组:
第一的
#!/bin/bash
ar=('foo' 'bar' 'baz' 'bat')
second "${ar[@]}" #this is equivalent to: second foo bar baz bat
第二
#!/bin/bash
arr=( "$@" )
printf ' ->%s\n' "${arr[@]}"
<<PRINTS
-> foo
-> bar
-> baz
-> bat
PRINTS
一点建议:
- 保留
export
ed 变量的所有大写字母 - 除非您有非常充分的具体理由不这样做,否则
"${someArray[@]}"
应始终使用双引号;这个公式的行为完全一样'array item 0' 'array item 1' 'aray item 2' 'etc.'
(假设someArray=( 'array item 0' 'aray item 1' 'aray item 2' 'etc.' )
)
答案2
该AR
数组通过第一个参数传递给second.sh
。
首先.sh
#!/bin/bash
AR=('foo' 'bar' 'a space' 'bat')
printf "AR array contains %d elements: " ${#AR[@]}
printf "%s " "${AR[@]}"
printf "\n"
./second.sh "$AR"
./second.sh "$(printf "(" ; printf "'%s' " "${AR[@]}" ; printf ")")"
sh
请注意,不再使用它来运行second.sh
脚本。
这些链接printf
用于伪造单个参数,如果某些数组元素包含空格字符,该参数将是安全的。
第二个.sh
#!/bin/bash
declare -a ARR=$1
printf "ARR array contains %d elements: " ${#ARR[@]}
printf "%s " "${ARR[@]}"
printf "\n"
----
AR
对于使用任意数量的参数将数组传递给脚本的解决方案second.sh
。
首先.sh
#!/bin/bash
AR=('foo' 'bar' 'a space' 'bat')
printf "AR array contains %d elements: " ${#AR[@]}
printf "%s " "${AR[@]}"
printf "\n"
./second.sh "$AR"
./second.sh "${AR[@]}"
第二个.sh
#!/bin/bash
ARR=( "$@" )
printf "ARR array contains %d elements: " ${#ARR[@]}
printf "%s " "${ARR[@]}"
printf "\n"
----
考试:
$ chmod +x *sh
$ ./first.sh
AR array contains 4 elements: foo bar a space bat
ARR array contains 1 elements: foo
ARR array contains 4 elements: foo bar a space bat
答案3
第一的
#!/bin/bash
ar=('foo' 'bar' 'baz' 'bat')
./second "${ar[@]}"
第二
#!/bin/bash
read -a arr1 <<< "${BASH_ARGV[@]}"
echo "${arr1[@]}"
这应该已经足够了,但是数组顺序颠倒了,所以我添加了:
for (( i=${#arr1[@]}-1,j=0 ; i>=0 ; i--,j++ ))
do
arr2[j]="${arr1[i]}"
done
echo "${arr2[@]}"
read -a
将输入读取到数组 arr1 中,但由于某种原因我无法弄清楚,该数组已反转,因此我将其反转回 arr2 中。