작업하기에 좋은 방법 은 테스트 용 eval
으로 교체하는 것입니다 echo
. echo
그리고 eval
(우리는 따로 설정하면 같은 일을 \x
일부 수행 확장 echo
등의 구현 bash
'어떤 조건들).
두 명령 모두 사이에 하나의 공백으로 인수를 결합합니다. 차이점은 결과를 쉘 코드로 평가 / 해석 하는 동안 결과 를 echo
표시 한다는 것입니다.eval
그래서 어떤 쉘 코드를 보려고
eval $(echo $var_name=$var_value)
평가하면 다음을 실행할 수 있습니다.
$ echo $(echo $var_name=$var_value)
fruit=blue orange
그것은 당신이 원하는 것이 아니라 원하는 것입니다.
fruit=$var_value
또한 $(echo ...)
여기를 사용하는 것은 의미가 없습니다.
위를 출력하려면 다음을 실행하십시오.
$ echo "$var_name=\$var_value"
fruit=$var_value
따라서 해석하기 위해 간단히 다음과 같습니다.
eval "$var_name=\$var_value"
개별 배열 요소를 설정하는 데에도 사용할 수 있습니다.
var_name='myarray[23]'
var_value='something'
eval "$var_name=\$var_value"
다른 사람들이 말했듯이 코드를 bash
구체적으로 신경 쓰지 않으면 다음 declare
과 같이 사용할 수 있습니다 .
declare "$var_name=$var_value"
그러나 부작용이 있습니다.
변수의 범위를 변수가 실행되는 함수로 제한합니다. 따라서 다음과 같은 경우에는 변수를 사용할 수 없습니다.
setvar() {
var_name=$1 var_value=$2
declare "$var_name=$var_value"
}
setvar foo bar
그것이 foo
지역 변수를 선언 setvar
하므로 쓸모가 없습니다.
bash-4.2
전역 변수 를 선언 하는 -g
옵션을 추가 했지만 호출자가 함수 인 경우 호출자의 변수와 달리 전역 변수를 설정하기 때문에 원하는 것이 아닙니다 .declare
setvar
setvar() {
var_name=$1 var_value=$2
declare -g "$var_name=$var_value"
}
foo() {
local myvar
setvar myvar 'some value'
echo "1: $myvar"
}
foo
echo "2: $myvar"
어떤 출력 :
1:
2: some value
또한 변수가 이미 설정된 경우 declare
호출 되는 동안 declare
(실제로 bash
Korn 쉘의 typeset
내장 에서 개념을 빌린 ) declare
새 변수를 선언하지 않으며 할당 방법은 변수 유형에 따라 다릅니다.
예를 들어 :
varname=foo
varvalue='([PATH=1000]=something)'
declare "$varname=$varvalue"
varname
이전에 스칼라 , 배열 또는 연관 배열 로 선언 된 경우 다른 결과가 생성 될 수 있습니다 (그리고 잠재적으로 불쾌한 부작용이 발생할 수 있음) .
eval
그 방법을 사용 하는 것은 잘못입니다.$var_value
전달하기 전에 확장 중이므로eval
쉘 코드로 해석됩니다! (예를 들어 시도var_value="';:(){ :|:&};:'"
)