Подтвердить что ты не робот

Допускайте аргументы до Bash script внутри функции

Внутри функции $1 ... $n - параметры, переданные этой функции. Вне функции $1 ... $n находятся параметры, переданные в script.

Можно ли каким-либо образом получить доступ к параметрам, переданным в script внутри функции?

4b9b3361

Ответ 1

Обычно вы просто передаете их как параметры функции во время вызова.

Альтернативой (урче) является размещение их в глобальных переменных.

Ответ 2

(Я знаю, что это старый пост, но ни один из ответов на самом деле не ответил на вопрос.)

Используйте массив BASH_ARGV. Он содержит аргументы, переданные вызывающему script в обратном порядке (т.е. Это стек с вершиной в индексе 0). Возможно, вам придется включить расширенную отладку в shebang (например, #!/bin/bash -O extdebug) или с помощью shopt (например, shopt -s extdebug), но он работает для меня в bash 4.2_p37 без его включения.

От man bash:

Переменная массива, содержащая все параметры в текущем стеке вызовов выполнения bash. Последний параметр последнего вызова подпрограммы находится в верхней части стека; первый параметр начального вызова находится внизу. Когда выполняется подпрограмма, поставляемые параметры помещаются на BASH_ARGV. Оболочка устанавливает BASH_ARGV только в расширенном режиме отладки....

Здесь функция, которую я использую для вывода всех аргументов в одной строке:

# Print the arguments of the calling script, in order.
function get_script_args
{
    # Get the number of arguments passed to this script.
    # (The BASH_ARGV array does not include $0.)
    local n=${#BASH_ARGV[@]}

    if (( $n > 0 ))
    then
        # Get the last index of the args in BASH_ARGV.
        local n_index=$(( $n - 1 ))

        # Loop through the indexes from largest to smallest.
        for i in $(seq ${n_index} -1 0)
        do
            # Print a space if necessary.
            if (( $i < $n_index ))
            then
                echo -n ' '
            fi

            # Print the actual argument.
            echo -n "${BASH_ARGV[$i]}"
        done

        # Print a newline.
        echo
    fi
}

Ответ 3

Как заявил Бенуа, самым простым решением является передать аргументы командной строки функции как аргументы функции с помощью [email protected], тогда вы можете ссылаться на них точно так же, как вне функции. Вы действительно будете ссылаться на значения, переданные функции, которые просто имеют то же значение, что и аргументы командной строки, помните об этом.

Обратите внимание, что это в значительной степени мешает вам передавать любые другие аргументы функции, если вы точно не знаете, сколько аргументов будет передано в командной строке (маловероятно, что это зависит от пользователя и не связано вашими ограничениями )

то есть.

    function fname {
    # do something with $1 $2 $3...$n #
    }

    # [email protected] represents all the arguments passed at the command line #
    fname [email protected]

Лучше всего передать только те аргументы, которые, как вы знаете, будете использовать, таким образом вы можете использовать их в функции И также передавать другие параметры из своего кода, если хотите

то есть.

    function fname {
    # do something with $1 $count $2 and $3 #
    }

    count=1
    fname $1 $count $2 $3

Ответ 4

Вы можете хранить все свои аргументы script в глобальном массиве:

args=("[email protected]")

а затем получить доступ к ним в функции:

f(){
    echo ${args[0]} ${args[1]}
}

Ответ 5

Вероятно, вы должны использовать "[email protected]" и передать это в конце списка аргументов функции. Внутри функции shift после разбора ваших аргументов и используйте $1 до $n как обычно.

Ответ 6

Спасибо за советы - они вдохновили меня написать функцию вызова. Я использовал команду "column" для эстетики.

callstack() {
    local j=0 k prog=$(basename $0)
    for ((i=1; ((i<${#BASH_ARGC[*]})); i++))
    do
        echo -n "${FUNCNAME[$i]/main/$prog} " # function name
        args=""
        for ((k=0; ((k<${BASH_ARGC[$i]})); k++))
        do
            args="${BASH_ARGV[$j]} $args" # arguments
            let j++
        done
        echo -e "$args\t|${BASH_LINENO[$i]}" $(sed -n ${BASH_LINENO[$i]}p "$0" 2>/dev/null) # line calling the function
    done | column -t -s $'\t' -o ' ' | sed 1d # delete callstack entry
}
compareTemplates brother_001270_1.jpg     |163  compareTemplates "$f" # process the rest
processPdf brother_001270.pdf             |233  filetype "${f%[*}" pdf && processPdf "$f"
process brother_001270.pdf                |371  --process) shift; process "[email protected]"; exit ;; # process jpg or pdf
sm --quiet --process brother_001270.pdf   |0