Bash 4.3 이후 버전 인 feb 2014 (?)는 "eval"이외의 참조 변수 또는 이름 참조 (namerefs)에 대해 동일한 유리한 성능 및 간접 효과를 제공하며 스크립트에서 더 명확하고 더 어려울 수 있습니다. "eval"을 잊고이 오류를 수정해야합니다 ":
declare [-aAfFgilnrtux] [-p] [name[=value] ...]
typeset [-aAfFgilnrtux] [-p] [name[=value] ...]
Declare variables and/or give them attributes
...
-n Give each name the nameref attribute, making it a name reference
to another variable. That other variable is defined by the value
of name. All references and assignments to name, except for⋅
changing the -n attribute itself, are performed on the variable
referenced by name's value. The -n attribute cannot be applied to
array variables.
...
When used in a function, declare and typeset make each name local,
as with the local command, unless the -g option is supplied...
그리고 또한:
파라미터
nameref 또는 다른 변수에 대한 참조를 작성하기 위해 -n 옵션을 사용하여 선언 또는 로컬 내장 명령 (아래의 선언 및 로컬 설명 참조)에 변수에 nameref 속성을 지정할 수 있습니다. 이를 통해 변수를 간접적으로 조작 할 수 있습니다. nameref 변수가 참조되거나 할당 될 때마다 실제로 nameref 변수의 값으로 지정된 변수에 대해 작업이 수행됩니다. nameref는 일반적으로 쉘 함수 내에서 함수 이름을 인수로 전달한 변수를 나타내는 데 사용됩니다. 예를 들어, 변수 이름이 첫 번째 인수로 쉘 함수에 전달되면
declare -n ref=$1
함수 내에서 nameref 변수 ref가 생성되며 그 값은 첫 번째 인수로 전달 된 변수 이름입니다. 참조에 대한 참조 및 지정은 이름이 $ 1로 전달 된 변수에 대한 참조 및 지정으로 처리됩니다. for 루프의 제어 변수에 nameref 속성이있는 경우 단어 목록은 쉘 변수 목록이 될 수 있으며 루프가 실행될 때 목록의 각 단어에 대해 이름 참조가 설정됩니다. 배열 변수에는 -n 속성을 부여 할 수 없습니다. 그러나 nameref 변수는 배열 변수 및 아래 첨자 배열 변수를 참조 할 수 있습니다. -n 옵션을 사용하여 unset 내장에 Nameref를 설정 해제 할 수 있습니다. 그렇지 않으면, nameref 변수의 이름을 인수로하여 unset을 실행하면,
예를 들어 ( 편집 2 : (Ron 덕분에) 함수 내부 변수 이름을 네임 스페이스 (접두어 붙임)하여 외부 변수 충돌을 최소화하고 결국 Karsten의 의견에서 제기 된 문제에 올바르게 응답해야합니다.
# $1 : string; your variable to contain the return value
function return_a_string () {
declare -n ret=$1
local MYLIB_return_a_string_message="The date is "
MYLIB_return_a_string_message+=$(date)
ret=$MYLIB_return_a_string_message
}
이 예제를 테스트 :
$ return_a_string result; echo $result
The date is 20160817
bash "declare"내장은 함수에서 사용될 때 기본적으로 선언 된 변수를 "local"로 만들고 "-n"은 "local"과 함께 사용할 수도 있습니다.
"중요한 선언"변수를 "지루한 로컬"변수와 구별하는 것을 선호하므로 이런 방식으로 "declare"및 "local"을 사용하면 문서로 작동합니다.
편집 1- (Karsten의 아래 의견에 대한 답변)-더 이상 아래에 의견을 추가 할 수는 없지만 Karsten의 의견에 대한 생각이 생겼습니다. 따라서 다음과 같은 테스트를 수행했습니다. 다음 단계는 제대로 작동하기 때문에 명령 줄에서 테스트 단계를 수행하여 존재한다고 가정하는 문제를 보여줍니다.
$ return_a_string ret; echo $ret
The date is 20170104
(위의 함수를 bash 용어에 붙여 넣은 후에 지금 막 실행했습니다. 보시다시피 결과는 정상적으로 작동합니다.)
function funcName {
초기 ksh에서 상속 된 POSIX 이전 레거시 구문이 있습니다 (bash는 의미 상 차이점이 있음).funcName() {
더와 함께function
, 대신 사용되어서는 안된다; wiki.bash-hackers.org/scripting/obsolete