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

问题描述 投票:0回答:4

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

我想要实现什么

我在

scriptOne.sh
中有一个字符串数组,我想将其传递给
scriptTwo.sh

到目前为止我做了什么

我可以使用

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

问题是当我尝试传递数组变量时它没有被传递。我已经设法使用

./scriptTwo.sh "${array[@]}"
让它传递数组的第一个条目,但这只是其中一个条目,我需要所有条目。

提前感谢您的帮助

arrays bash shell parameter-passing
4个回答
13
投票

你传递数组的方式是正确的

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

问题可能出在您接收它的方式上。在

scriptTwo.sh
中,使用

array=("$@")

0
投票

我认为如果使用declare命令,我们可以直接从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)

我已经测试了这个命令,它工作正常。

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


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

0
投票

跟进有关传递多个数组的问题,我找到了一种肮脏但有效的解决方案,即将数组作为字符串传递并使用 IFS 将其解析为数组:

IFS=',' read -ra array1 <<< "$1"
IFS=',' read -ra array2 <<< "$2"

for element1 in "${array1[@]}"; do
    for element2 in "${array2[@]}"; do
        echo "Element 1: $element1, Element 2: $element2"
    done
done
© www.soinside.com 2019 - 2024. All rights reserved.