我是编写 Shell 脚本的新手,遇到了一些困难。
我想要实现什么
我在
scriptOne.sh
中有一个字符串数组,我想将其传递给 scriptTwo.sh
到目前为止我做了什么
我可以使用
./scriptTwo.sh
从第一个脚本中执行第二个脚本,并且我已使用 ./scriptTwo.sh $variableOne
将字符串变量从一个脚本传递到另一个脚本。
问题是当我尝试传递数组变量时它没有被传递。我已经设法使用
./scriptTwo.sh "${array[@]}"
让它传递数组的第一个条目,但这只是其中一个条目,我需要所有条目。
提前感谢您的帮助
你传递数组的方式是正确的
./scriptTwo.sh "${array[@]}"
问题可能出在您接收它的方式上。在
scriptTwo.sh
中,使用
array=("$@")
我认为如果使用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 数组的内容。
我解决这个问题的方法是单步执行 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
跟进有关传递多个数组的问题,我找到了一种肮脏但有效的解决方案,即将数组作为字符串传递并使用 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