Как передать аргумент массива в Bash script
Удивительно, что я не нашел ответа после 1 часа поиска этого.
Я хотел бы передать массив в мой script следующим образом:
test.sh argument1 array argument2
Я НЕ хочу помещать это в другой bash script, как показано ниже:
array=(a b c)
for i in "${array[@]}"
do
test.sh argument1 $i argument2
done
Ответы
Ответ 1
Bash массивы не являются "значениями первого класса" - вы не можете передавать их как одну "вещь".
Предполагая, что test.sh
является bash script, я бы сделал
#!/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
Ответ 2
Введите script 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[@]"
Над script будет напечатан:
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 с помощью синтаксиса . ./script
. Обратите внимание, что это для выполнения команд script в текущей среде оболочки.
Q. Почему текущая среда оболочки и почему она не является суб-оболочкой?
A. Поскольку bash не экспортирует переменные массива в дочерние процессы, поскольку задокументирован здесь bash автором
Ответ 3
Если это ваша команда:
test.sh argument1 ${array[*]} argument2
Вы можете прочитать массив в test.sh следующим образом:
arg1=$1
arg2=${2[*]}
arg3=$3
Он будет жаловаться на вас ( "плохая замена" ), но будет работать.