Передать комбинацию аргументов и массива из сценария оболочки linux другому сценарию оболочки - PullRequest
0 голосов
/ 25 сентября 2018

Как передать ниже 2 переменных и массив (размеры будут меняться каждый раз) из сценария оболочки linux в другой сценарий оболочки?

logfolder=mylogfolder
processname=myname

script=(\
[1]="1 MyScript1" \
[2]="2 MyScript2 MyScript3 MyScript4 MyScript5 MyScript6 MyScript7 MyScript8 MyScript9 MyScript10 MyScript11" \
[3]="2 MyScript12 MyScript13" \
[4]="2 MyScript14 MyScript15" \
[5]="1 MyScript16" \
[6]="1 MyScript17")

1 Ответ

0 голосов
/ 25 сентября 2018

Вам нужно передать только элементы массива или конкретные сопоставления индекса-> элемента?Причина, по которой я спрашиваю, состоит в том, что приведенный вами пример массива имеет индексы 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[@]}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...