bash 동적 (변수) 변수 이름


12

요소 배열을 조작하여 일련의 문자열을 동적으로 만들고 일부 산술 절차를 만들고 싶습니다.

for name in FIRST SECOND THIRD FOURTH FIFTH; do
    $name = $(( $6 + 1 ))
    $name = "${$name}q;d"
    echo "${$name}"; printf "\n"
done

욕망 결과는 다음과 $6같습니다 0.

1q;d
2q;d
3q;d
4q;d
5q;d

하지만이 오류가 발생합니다

reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution

간단한 것 같아요. 내가 뭔가를했을 때 작동하는 데 사용

FIRST=$(( $6 + 1 ))
FIRST="${FIRST}q;d"

1
좀 더 잘 설명해 주시겠습니까? 당신이 무엇을하려고하는지 정말로 이해하지 마십시오.
neuron

`$ name = $ (($ 6 + 1))`은 무엇을해야합니까?
PSkocik

@PSkocik 내가하고 FIRST=$(( $6 + 1 ))
싶었다

답변:


16

우선 =에 변수 선언에 공백이있을 수 없습니다 bash.

원하는 것을 얻으려면을 사용할 수 있습니다 eval.

예를 들어 당신과 같은 샘플 스크립트 :

#!/bin/bash
i=0
for name in FIRST SECOND THIRD FOURTH FIFTH; do
    eval "$name"="'$(( $i + 1 ))q;d'"
    printf '%s\n' "${!name}"
    i=$(( $i + 1 ))
done

인쇄 :

1q;d
2q;d
3q;d
4q;d
5q;d

eval신중하게 사용하면 , 어떤 사람들은 정당한 이유로 그것을 악이라고 부릅니다.

declare 너무 작동합니다 :

#!/bin/bash
i=0
for name in FIRST SECOND THIRD FOURTH FIFTH; do
    declare "$name"="$(( $i + 1 ))q;d"
    printf '%s\n' "${!name}"
    i=$(( $i + 1 ))
done

또한 인쇄 :

1q;d
2q;d
3q;d
4q;d
5q;d

!느낌표 는 무엇입니까 printf '%s\n' "${!name}"?
giannis christofakis

1
이를 bash매개 변수 확장의 간접 확장이라고 부릅니다. 이것을
읽으십시오

1
Bash는 declare/ eval:에 대한 대안이 더 printf -v varname '%fmt' args좋습니다. 일부 bash-completion 내부 함수는이를 참조 별 호출에 사용합니다. (저장할 변수의 이름을 전달하십시오).
Peter Cordes

참고 : 사용 declare하면 로컬 범위의 변수 만 설정되고 eval접근 방식은 전역 적으로 설정됩니다.
사용자

11

다른 변수에 이름을 저장 한 상태에서 bash 변수를 참조하려면 다음과 같이하십시오.

$ var1=hello
$ var2=var1
$ echo ${!var2}
hello

이 경우 var2에 액세스하려는 변수의 이름을 저장합니다. 그런 다음 액세스 하려는 변수의 이름을 보유한 변수가있는 ${!<varable name>}위치 <variable name>로 액세스하십시오.


휴대용 방법이 eval var=\$$holder있지만 eval위험합니다!
gavenkoa

1
index=0;                                                                                                                                                                                                           
for name in FIRST SECOND THIRD FOURTH FIFTH; do
    name=$(($index + 1))
    echo "${name}q;d"
    index=$((index+1))
done

당신이 시도하는 것입니까?


1

코드와 원하는 출력에서 ​​얻은 것 (잘못된 경우 수정) :
"FIRST"/ "SECOND"/ ... 변수 이름을 사용하지 않고 인덱스가있는 루프가 필요합니다. .

이것은 일을 할 것입니다 :

for i in {1..5} ; do echo $i"q;d" ; done


네, 추가로 변수로 산술 함수를하고 싶다는 것을 제외하고는 옳습니다.
giannis christofakis

이 산술 함수의 예를들 수 있습니까? 변수 이름 (예 : "THIRD")이나 색인 값이 필요합니까?
csny

SUM=$(($6 + $i)); echo $SUM"q;d", 내가 뭘 잘못하고 있는지 봅니다.
giannis christofakis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.