변수 이름으로 변수 정의

변수 이름으로 변수 정의

이 스크립트에 어떤 문제가 있나요? 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)'

  • letdeclare명령을 실행하지 않는다는 점에서 와 유사합니다 . 그러나 산술 연산에는 반대의 방법을 사용할 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

관련 정보