1

Как передать массив как переменную из первого сценария оболочки bash во второй сценарий.

first.sh
#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
sh second.sh "$AR" # foo
sh second.sh "${AR[@]}" # foo
second.sh
#!/bin/bash
ARR=$1
echo ${ARR[@]}

В обоих случаях результат foo . Но результат, которого я хочу - это foo bar baz bat .

Что я делаю не так и как мне это исправить?

1 ответ1

2

Массив AR передается через первый аргумент в second.sh .

first.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 используются для подделки одного параметра, который будет безопасен, если некоторые элементы массива содержат пробелы.

second.sh

#!/bin/bash
declare -a ARR=$1
printf "ARR array contains %d elements: " ${#ARR[@]}
printf "%s " "${ARR[@]}"
printf "\n"

----

Для решения, в котором массив AR передается с использованием любого количества аргументов в скрипт second.sh .

first.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[@]}"

second.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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .