이 스크립트에 어떤 문제가 있나요? A1=1, B1=1, C1=1을 정의하려고 합니다.
LIST="A B C"
for x in $LIST
do
"$x"1=1
done
결과 :
./x.: line 7: A1=1: command not found
./x.: line 7: B1=1: command not found
./x.: line 7: C1=1: command not found
답변1
변수 할당 형식은 변수 이름, 등호 및 (선택 사항) 값입니다.
이것은 유효한 할당입니다:
ABC=123
"$x"1=1
"$x"1
변수 이름이 아니기 때문에 유효한 할당이 아닙니다 . 아마도평가하다변수 이름과 유사하지만 실제로는 그렇지 않습니다. 실제로 쉘은 그것이 명령이라고 생각합니다.
달성하려는 목표를 달성하는 한 가지 방법은 다음과 같습니다.
eval "$x"1=1
Bash의 또 다른 방법은 다음과 같습니다(다른 쉘에서는 아님).
declare "$x"1=1
또는 (다시 bash에만 해당):
let "$x"1=1
(당신의 상황도 크게 다르지 않습니다.)
그러나 다음과 같이자쿠제에서 지적했다논평, 쉘에 배열(ksh, bash 또는 zsh)이 있는 경우 배열을 사용할 수 있습니다.
완전성을 위해:
eval
임의의 명령을 실행합니다. 따라서 등호 오른쪽에 명령으로 확장되는 변수가 있으면 해당 명령이 실행됩니다. 아래 코드:x=a y='$(echo hello)' eval "$x=$y"
.
a=hello
declare
변수를 할당하고 어떤 명령도 실행하지 않는 bash 내장 명령입니다. 아래 코드:x=a y='$(echo hello)' declare "$x=$y"
.
a='$(echo hello)'
let
declare
명령을 실행하지 않는다는 점에서 와 유사합니다 . 그러나 산술 연산에는 반대의 방법을 사용할declare
수도 있습니다 .let
let a="1 + 2"
.
a=3
답변2
bash FAQ에는항목간접에 대해. 대부분의 사용 사례에서 실제로 해야 할 일은 연관 배열이나 인덱스 배열을 사용하는 것입니다. 당신은 또한 사용할 수 있습니다
func_call_by_reference() { # Bash 4.3
typeset -n ref=$1 # nameref to the variable named by the caller
ref=( "val1" "val2" ... ) # return an array by reference
}
복잡한 참조를 피하면서 이 작업을 수행하기 위한 추가 옵션은 FAQ 항목을 참조하세요 eval
.
답변3
다음 코드를 사용할 수 있습니다. 코드에서 셸은 "$x"1=1
유효한 변수 할당이 아니기 때문에 명령으로 실행됩니다.
LIST="A B C"
for x in $LIST
do
a=$(echo "$x"1)
let $a=1
done