将数组从一个Bash脚本传递到另一个

时间:2013-04-15 15:45:46

标签: arrays bash shell parameter-passing

我是编写Shell Scripts的新手,我遇到了一些困难。

我想要实现的目标

我在scriptOne.sh中有一个字符串数组,我希望传递给scriptTwo.sh

我做得太远

我可以使用./scriptTwo.sh从第一个脚本中执行第二个脚本,并使用./scriptTwo.sh $variableOne将字符串变量从一个传递到另一个。

问题是当我尝试传递一个数组变量时它没有被传递。我设法让它使用./scriptTwo.sh "${array[@]}"传递数组的第一个条目,但这只是其中一个条目,我需要所有条目。

提前感谢您的帮助

3 个答案:

答案 0 :(得分:7)

传递数组的方式是正确的

./scriptTwo.sh "${array[@]}"

问题可能在于您收到它的方式。在scriptTwo.sh中,使用

array=("$@")

答案 1 :(得分:0)

如果您使用声明命令,我认为我们可以直接从sriptOne.sh中读取数组内容。

我在scriptOne.sh中声明了一个名为wes_batch_array的关联数组,我想将其传递给scriptTwo.sh,因此我将下面的命令放在scriptTwo.sh中:

declare -A wes_batch_array=$(awk -F '=' '{if ($1 ~ /^declare -A wes_batch_array/) {for (i=2;i<NF;i++) {printf $i"=";} printf $NF"\n";}}' < scriptOne.sh)

我已经测试了此命令,它可以正常工作。

如果不使用声明命令。您可以将数组的内容回显到另一个中间临时文件,并使用上面的awk命令来获取bash数组的内容。

答案 2 :(得分:0)

我解决这个问题的方法是遍历 script1.sh 中的数组,然后使用 for 循环将数组元素传递给 script2.sh。就我而言,我将许多元素数量不同的数组传递给不同服务器上的同一个 script2.sh。

例如:

script1.sh:

records="111111111 222222222 333333333"
myRecordsArray=($records)

for (( i=0 ; i < $(#myRecordsArray[@]} ; i++ )); do

./script2.sh ${myRecordsArray[i]}

done

script2.sh:

main () {
<some code here>
}

myRecord=$1
main $myRecord