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

12

我刚接触写Shell脚本,目前遇到一些困难。

我的目标

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

我已经做了什么

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

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

感谢您的帮助


相关:https://dev59.com/Mo3da4cB1Zd3GeqP15Rn - AlikElzin-kilaka
4个回答

14

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

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

问题可能出在你接收信息的方式上。在scriptTwo.sh中,使用以下命令:

array=("$@")

1
如果我将多个数组传递给这个第二个脚本,该怎么办?有没有一种方法来声明哪一个是 arrayOne=("$1@") 等等。 - StuStirling
1
@DiscoS2:传递多个数组会更加棘手。不过,在第二个脚本中,可以在每个数组之前添加数组大小,然后填充数组。 - choroba
谢谢回复。我决定改变传递数据的方式,因为这样在长期来看更容易,但还是感谢你的答案。它确实有帮助! - StuStirling

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

我认为如果您使用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

关于传递多个数组的问题,我找到了一种有点脏但仍然有效的解决方案,即将数组作为字符串传递,并使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接