bash 동적(변수) 변수 이름

bash 동적(변수) 변수 이름

요소 배열을 조작하고 일부 산술 프로세스를 생성하여 문자열 시퀀스를 동적으로 생성하고 싶습니다.

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

다른 변수에 이름을 저장하는 동안 bash 변수를 참조하려면 다음과 같이 할 수 있습니다.

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

이 예에서는 액세스 중인 변수의 이름이 var2에 저장됩니다. 그런 다음 액세스하려는 변수의 이름이 들어 있는 변수를 ${!<varable name>}사용 하여 액세스할 수 있습니다 .<variable name>

답변2

첫째, =의 변수 선언 주위에는 공백이 있어서는 안 됩니다 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

답변3

좀 더 철저한 버전을 보여주고 싶었습니다.에릭 리노프의 답변변수 이름을 동적으로 생성하는 방법을 명확하게 설명~에서많은 종류의다른 변수그런 다음 동적으로 생성된 새 변수의 내용에 액세스합니다.

some_variable="Hey how are you?"

# the 1st half of the variable name "some_variable"
var1="some"
# the 2nd half of the variable name
var2="variable"

# dynamically recreate the variable name "some_variable", stored
# as a string inside variable `var3`
var3="${var1}_${var2}"

이제 다음 출력을 살펴보세요.

echo "${var3}"

산출:

some_variable

하지만 이것은 (위와 완전히 똑같습니다.!변수 이름 앞에 char을 추가한 것을 제외하면 ):

echo "${!var3}"

산출:

Hey how are you?

놀라운!

그것은좋다echo "${${var3}}"우리는 확장하여 echo "${some_variable}"가 되는 C 매크로를 가지고 있습니다 Hey how are you?.

그러나 구문이 잘못되어 다음 오류가 발생합니다.

$ echo "${${var3}}"
bash: ${${var3}}: bad substitution

echo "${!var3}"이 트릭은 "위험"하고 "악"으로 간주되므로 eval대신 사용할 수 있습니다 . eval하지만 이해와 교육을 위해서는이 작업을 수행하는 동등한 eval방법 은 다음과 같습니다.:

$ eval echo "\$${var3}"
Hey how are you?

비교적:

$ echo "${!var3}"
Hey how are you?

eval echo "\$${var3}"eval echo "$some_variable"동일한 출력으로 로 확장됩니다 .

$ eval echo "$some_variable"
Hey how are you?

그러나 생산한다고 eval echo "\$${var3}"하더라도echo "${!var3}"정확히 같은 결과이 경우( Hey how are you?출력) 분명히 eval버전은 악하고 !버전은 좋습니다.

echo "${!var3}"다음과 같이 "좋은" 버전( )을 읽을 수 있습니다 .

에코는 "$var3""변수의 내용을 출력한다 var3"는 의미입니다. 그러나 echo는 다음을 "${!var3}"의미합니다. "출력 변수에 가 포함되어 있다고 var3가정합니다.그 내용다른 변수 이름 지정! "

여기서 배쉬 !거의*이러한 문자를 사용하여 C에서 포인터를 역참조하는 것과 같습니다! :

*some_ptr

추가 추상화 계층을 추가합니다.

관련된

  1. !이 트릭은 일반적 으로 다음을 사용하여 피할 수 있습니다.연관 배열배쉬에서. 연관 배열은 본질적으로 C++에서는 "정렬되지 않은 맵", Python에서는 "dicts"라고 하는 "해시 테이블"입니다. 다음은 관련 링크입니다:

    1. https://stackoverflow.com/questions/6149679/multiDimension-associative-arrays-in-bash
    2. [아주 좋은 튜토리얼입니다! ] *****https://www.artificialworlds.net/blog/2012/10/17/bash-associative-array-examples/

    하지만 bash의 연관 배열(및 기타 모든 배열)은 다음과 같습니다.1차원! 출처 man 1 bash(강조 추가):

    정렬

    배쉬가 제공하는1차원적인 색인그리고연관배열 변수. 모든 변수는 배열에 대한 인덱스로 사용될 수 있습니다. 내장 선언은 배열을 명시적으로 선언합니다. 배열 크기에는 최대 제한이 없으며, 멤버를 연속적으로 인덱싱하거나 할당해야 한다는 요구 사항도 없습니다. 인덱스 배열은 정수(산술 표현식 포함)를 사용하여 참조되며 0부터 시작합니다. 연관 배열은 임의의 문자열을 사용하여 참조됩니다. 달리 명시하지 않는 한, 인덱스 배열 인덱스는 음수가 아닌 정수여야 합니다.

    name[subscript]=value 구문을 사용하여 변수를 할당하면 인덱스 배열이 자동으로 생성됩니다. 아래 첨자는 숫자로 평가되어야 하는 산술 표현식으로 처리됩니다. 인덱스 배열을 명시적으로 선언하려면 선언 -a 이름을 사용하십시오(아래의 SHELL BUILTIN 명령 참조). -a name[subscript] 문도 허용됩니다.

    연관 배열은 -A name 명령문을 사용하여 생성됩니다.

    선언 및 읽기 전용 내장 함수를 사용하여 배열 변수의 속성을 지정할 수 있습니다. 각 속성은 배열의 모든 멤버에 적용됩니다.

    배열은 name=(value1 ... valuen) 형식의 복합 할당을 사용하여 할당됩니다. 여기서 각 값은 [subscript]=string 형식입니다. 인덱스 배열 할당에는 문자열만 필요합니다. 인덱스 배열에 할당할 때 선택적 괄호와 아래 첨자가 제공되면 해당 인덱스가 할당됩니다. 그렇지 않으면 할당된 요소의 인덱스는 명령문에 의해 할당된 마지막 인덱스에 1을 더한 것입니다. 인덱싱은 0부터 시작됩니다.

    연관 배열에 할당할 때 아래 첨자가 필요합니다.

답변4

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

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

관련 정보