Внутри функции $1 ... $n
- параметры, переданные этой функции.
Вне функции $1 ... $n
находятся параметры, переданные в script.
Можно ли каким-либо образом получить доступ к параметрам, переданным в script внутри функции?
Внутри функции $1 ... $n
- параметры, переданные этой функции.
Вне функции $1 ... $n
находятся параметры, переданные в script.
Можно ли каким-либо образом получить доступ к параметрам, переданным в script внутри функции?
Обычно вы просто передаете их как параметры функции во время вызова.
Альтернативой (урче) является размещение их в глобальных переменных.
(Я знаю, что это старый пост, но ни один из ответов на самом деле не ответил на вопрос.)
Используйте массив 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
}
Как заявил Бенуа, самым простым решением является передать аргументы командной строки функции как аргументы функции с помощью [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
Вы можете хранить все свои аргументы script в глобальном массиве:
args=("[email protected]")
а затем получить доступ к ним в функции:
f(){
echo ${args[0]} ${args[1]}
}
Вероятно, вы должны использовать "[email protected]"
и передать это в конце списка аргументов функции. Внутри функции shift
после разбора ваших аргументов и используйте $1
до $n
как обычно.
Спасибо за советы - они вдохновили меня написать функцию вызова. Я использовал команду "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