it-swarm.com.ru

Как передать аргумент массива в скрипт Bash

Меня удивляет, что я не нахожу ответ после 1 часа поиска этого . Я хотел бы передать массив в мой скрипт следующим образом:

test.sh argument1 array argument2

Я не хочу помещать это в другой скрипт bash, например:

array=(a b c)
for i in "${array[@]}"
do
  test.sh argument1 $i argument2
done
22
zhihong

Массивы Bash не являются «первоклассными значениями» - вы не можете передавать их как одну «вещь».

Предполагая, что test.sh является скриптом bash, я бы сделал

#!/bin/bash
arg1=$1; shift
array=( "[email protected]" )
last_idx=$(( ${#array[@]} - 1 ))
arg2=${array[$last_idx]}
unset array[$last_idx]

echo "arg1=$arg1"
echo "arg2=$arg2"
echo "array contains:"
printf "%s\n" "${array[@]}"

И вызвать это как

test.sh argument1 "${array[@]}" argument2
24
glenn jackman

Сделайте так, чтобы ваш скрипт arrArg.sh был таким:

#!/bin/bash

arg1="$1"
arg2=("${!2}")
arg3="$3"
arg4=("${!4}")

echo "arg1=$arg1"
echo "arg2 array=${arg2[@]}"
echo "arg2 #elem=${#arg2[@]}"
echo "arg3=$arg3"
echo "arg4 array=${arg4[@]}"
echo "arg4 #elem=${#arg4[@]}"

Теперь настройте ваши массивы следующим образом:

arr=(ab 'x y' 123)
arr2=(a1 'a a' bb cc 'it is one')

И передать аргументы, как это:

. ./arrArg.sh "foo" "arr[@]" "bar" "arr2[@]"

Над сценарием будет напечатано:

arg1=foo
arg2 array=ab x y 123
arg2 #elem=3
arg3=bar
arg4 array=a1 a a bb cc it is one
arg4 #elem=5

Примечание: Может показаться странным, что я выполняю скрипт с использованием синтаксиса . ./script. Обратите внимание, что это для выполнения команд сценария в среде current Shell

Q. Почему текущая среда Shell, а не вспомогательная оболочка?
A. Поскольку bash не экспортирует переменные массива в дочерние процессы, как задокументировано здесь самим автором bash

12
anubhava

Вы можете записать свой массив в файл, а затем получить файл в своем скрипте . Например:

array.sh

array=(a b c)

test.sh

source $2
...

Запустите скрипт test.sh:

./test.sh argument1 array.sh argument3
0
Dd H