В Bash FAQ есть целая запись о вызове по ссылке / косвенному обращению .
В простом случае - лучшая альтернатива eval
, предложенная другими ответами, что значительно упрощает цитирование .
func() { # set the caller's simple non-array variable
local retvar=$1
printf -v "$retvar" '%s ' "${@:2}" # concat all the remaining args
}
Завершение Bash (код, который запускается при нажатии клавиши табуляции) переключился на printf -v
вместо eval
для своих внутренних функций, потому что он более читабелен. и наверное быстрее.
Для возврата массивов в Bash FAQ предлагается использовать read -a
для чтения в последовательные индексы массива переменной массива:
# Bash
aref=realarray
IFS=' ' read -d '' -ra "$aref" <<<'words go into array elements'
Bash 4.3 представил функцию, которая делает call- по ссылке в разы удобнее. Bash 4.3 все еще нова (2014).
func () { # return an array in a var named by the caller
typeset -n ref1=$1 # ref1 is a nameref variable.
shift # remove the var name from the positional parameters
echo "${!ref1} = $ref1" # prints the name and contents of the real variable
ref1=( "foo" "bar" "$@" ) # sets the caller's variable.
}
Обратите внимание, что формулировка страницы руководства bash немного сбивает с толку. В нем говорится, что атрибут -n
нельзя применять к переменным массива. Это означает, что у вас не может быть массива ссылок, но вы можете иметь ссылку на массив.