a1,a2,a3의 값을 에코하고 싶습니다. 하지만 내 코드는 a1, a2, a3만 인쇄하고 거기에 저장된 값은 인쇄하지 않습니다.

a1,a2,a3의 값을 에코하고 싶습니다. 하지만 내 코드는 a1, a2, a3만 인쇄하고 거기에 저장된 값은 인쇄하지 않습니다.
a1="one"
a2="two"
a3="three"
for ((i=1;i<=3;i=i+1)); do
     echo $a$i
done 

나는 다음을 시도했다

  1. echo ${a$i}
  2. echo $((ai))
  3. echo ${a}${i}
  4. c=$(echo a$i)

하지만 누구도 정답을 갖고 있지 않습니다.

답변1

이는 ksh93 구문입니다(이제 ((i=1;i<=3;i=i+1))and에서도 지원됩니다(and 사이에 공백이 필요함).bashzshfor((zsh

ksh93최신 버전 bash(4.3, 2014 이상) 에서는 다음을 수행할 수 있습니다.

a1="one"
a2="two"
a3="three"
for ((i=1;i<=3;i=i+1));do
    typeset -n name="a$i"
    printf '%s\n' "$name"
done 

에서는 zsh변수 간접 구문을 사용할 수 있습니다: ${(e)code}(1996년 5월 이후), ${(P)name}(1999년 이후)

a1="one"
a2="two"
a3="three"
for ((i=1;i<=3;i=i+1));do
    name=a$i
    printf '%s\n' "${(P)name}"
    # or
    code="\$a$i"
    printf '%s\n' "${(e)code}"
    # or combined:
    printf '%s\n' "${(e):-\$a$i}" "${(P)${:-a$i}}"
done 

bash또한 자체 변수 간접 지정 기능을 추가했지만 ksh93과 거의 반대되는 의미를 갖는 다른 구문(1996년 12월 2.0)을 사용했습니다.

a1="one"
a2="two"
a3="three"
for ((i=1;i<=3;i=i+1));do
    name=a$i
    printf '%s\n' "${!name}"
done 

POSIX 셸(ksh93, bash 또는 zsh를 포함하되 이에 국한되지 않음)을 사용하면 언제든지 다음을 수행할 수 있습니다.

a1="one"
a2="two"
a3="three"
i=1; while [ "$i" -le 3 ]; do
    name=a$i
    eval "value=\${$name}"
    printf '%s\n' "$value"
    i=$((i + 1))
done 

답변2

Bash에서 원하는 변수 이름이 포함된 변수가 있는 경우 간접 참조를 사용하여 액세스할 수 있습니다.

a1="one"
a2="two"
a3="three"
for((i=1;i<=3;i=i+1));do
    name="a$i"
    printf '%s\n' "${!name}"
done 

확장 매개변수를 사용 ${...}하고 첫 번째 문자가 이면 !나머지 문자는 액세스하려는 매개변수 이름을 포함하는 매개변수 이름으로 처리됩니다.

답변3

Bash를 사용하는 경우 동일한 작업을 수행하는 가장 쉬운 방법은 배열을 사용하는 것입니다.

a[1]="one"
a[2]="two"
a[3]="three"

for ((i=1; i<=3; i=i+1)); do
    echo "${a[$i]}"
done

배열을 반복할 수도 있습니다.

for value in "${a[@]}"; do
     echo "$value"
done

답변4

이 경로로 가야 한다면 bash다음을 수행하십시오. 아이디어는 다음을 사용하는 것입니다 eval.

#!/bin/bash

a1="one"
a2="two"
a3="three"

for ((i=1;i<=3;i=i+1)); do
  var="a${i}"
  eval out=\$${var}
  echo $out
done

산출:

하나 둘 셋

eval방법을 사용하면 참조 변수의 값을 가져올 수 있습니다. 따라서 변수 이름 자체(위의 "a${i}" var, 즉 a1, a2 등)가 있으면 eval내장 함수를 통해 변수의 값을 얻을 수 있습니다.

다음은 몇 가지 토론입니다.Bash의 "eval" 명령은 무엇입니까?

관련 정보