변수 이름으로 변수 정의


11

이 스크립트에 어떤 문제가 있습니까? 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
이런 식으로 bash에서 변수를 만들 수 있다고 생각하지 않습니다. 이것이 바로 배열입니다.
Jakuje

3
사용하십시오 eval "$x"1=1. Jakuje가 지적했듯이 배열 이이 경우에 더 적합 할 것입니다.
Andrea Corbellini

@AndreaCorbellini 답변으로 작성해야합니다.
Sparhawk

답변:


21

변수 할당은 변수 이름의 형식과 등호, (선택적) 값으로 구성됩니다.

이것은 유효한 과제입니다.

ABC=123

"$x"1=1"$x"1변수 이름이 아니기 때문에 유효한 할당 이 아닙니다. 변수 이름 으로 평가 될 수 있지만 그렇지 않습니다. 실제로 쉘은 그것이 명령이라고 믿습니다.

달성하려는 것을 수행하는 한 가지 방법은 다음과 같습니다.

eval "$x"1=1

bash의 다른 방법 (다른 쉘은 아님)은 다음과 같습니다.

declare "$x"1=1

또는 (또한 bash 전용) :

let "$x"1=1

(사례에는 큰 차이가 없습니다.)

그러나 Jakuje주석 에서 언급했듯이 쉘에 배열 (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.


심지어 ABC = 123유효하지 않습니다. equal(=)부호 앞뒤에 공백이 추가되기 때문 입니다.
Mahendran Sakkarai

3

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
}

지저분한 eval인용을 피하면서 더 많은 옵션을 보려면 FAQ 항목을 참조하십시오 .


0

다음과 같은 코드를 사용할 수 있습니다. 코드 쉘 "$x"1=1에서 유효한 변수 할당이 아니기 때문에 명령으로 실행 됩니다.

LIST="A B C"
for x in $LIST
do
    a=$(echo "$x"1)
    let $a=1
done

어떤 쉘을 사용하고 있습니까? bosh bash 4.1.7 및 4.3.11을 사용하면 command not found <varname>=1그렇게 할 때 오류가 발생합니다 (확실히 <varname>은 내가 저장 한 값임 a)
Eric Renouf

@Andrea Corbellini가 설명했듯이 let, 선언 또는 eval을 사용하여 값을 할당해야합니다.
AVJ

1
당신은 echo여기에 필요하지 않습니다 ! 그냥 a="$x"1. 또한 let산술 컨텍스트이므로 숫자 만 할당 할 수 있습니다.
Peter Cordes

declare $a=foobar공장.
Peter Cordes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.