Вам нужно передать только элементы массива или конкретные сопоставления индекса-> элемента?Причина, по которой я спрашиваю, состоит в том, что приведенный вами пример массива имеет индексы 1-6, но по умолчанию массив bash будет иметь индексы 0-5.Я собираюсь предположить, что индексы не важны (кроме порядка);если их нужно передать, все становится немного сложнее.
Есть два довольно стандартных способа сделать это;Вы можете передать два фиксированных аргумента в качестве первых двух позиционных параметров ($1
и $2
), а массив в качестве третьего - следующим образом:
#!/bin/bash
# Usage example:
# ./scriptname "mylogfolder" "myname" "1 MyScript1" \
# "2 MyScript2 MyScript3 MyScript4 MyScript5 MyScript6 MyScript7 MyScript8 MyScript9 MyScript10 MyScript11" \
# "2 MyScript12 MyScript13" ...
logfolder=$1
processname=$2
script=("${@:3}")
Или, если два значенияявляются необязательными, вы можете сделать их параметрами, которые принимают параметры, например:
#!/bin/bash
# Usage example:
# ./scriptname -l "mylogfolder" -p "myname" "1 MyScript1" \
# "2 MyScript2 MyScript3 MyScript4 MyScript5 MyScript6 MyScript7 MyScript8 MyScript9 MyScript10 MyScript11" \
# "2 MyScript12 MyScript13" ...
while getopts "l:p:" o; do
case "${o}" in
l)
logfolder =${OPTARG} ;;
p)
processname =${OPTARG} ;;
*)
echo "Usage: $0 [-l logfolder] [-p processname] script [script...]" >&2
exit 1
;;
esac
done
shift $((OPTIND-1))
script=("${@}")
В любом случае, чтобы передать массив, вы должны использовать "${arrayname[@]}"
для передачи каждого элемента в качестве отдельного аргумента вscript.
[EDIT] Передача индексов массива с элементами более сложна, так как список arg - это просто список строк.Вам нужно как-то кодировать индексы вместе с элементами, а затем анализировать их в скрипте.Вот один из способов сделать это, используя index=element
для каждой вещи в массиве:
#!/bin/bash
# Usage example:
# ./scriptname "mylogfolder" "myname" "1=1 MyScript1" \
# "2=2 MyScript2 MyScript3 MyScript4 MyScript5 MyScript6 MyScript7 MyScript8 MyScript9 MyScript10 MyScript11" \
# "3=2 MyScript12 MyScript13" ...
logfolder=$1
processname=$2
# Parse arguments 3 on as index=element pairs:
declare -a script=()
for scriptarg in "${@:3}"; do
index=${scriptarg%%=*}
if [[ "$index" = "$scriptarg" || -z "$index" || "$index" = *[^0-9]* ]]; then
echo "$0: invalid script array index in '$scriptarg'" >&2
exit 1
fi
script[$index]=${scriptarg#*=}
done
И чтобы вызвать его, вам нужно будет упаковать массив скриптов в соответствующем формате примерно так:
# Convert the normal script array to a version that has "index=" prefixes
scriptargs=()
for index in "${!script[@]}"; do # iterate over the array _indexes_
scriptargs+=("${index}=${script[$index]}")
done
./script.sh "$logfolder" "$processname" "${scriptargs[@]}"