다른 변수 "내부"에서 변수 참조 사용

다른 변수 "내부"에서 변수 참조 사용

나는 이것이 비교적 간단하다고 확신합니다. 나는 그것을 어떻게 해야할지 모르겠습니다.

#!/usr/bin/ksh
set `iostat`
myvar=6

나는 이것을 원한다 . 나는 그것을 -> -> echo ${$myvar}로 해석하고 싶다.${$myvar}${6}value

답변1

evalksh를 포함하여 많은 좋은 쉘에 내장된 쉘을 사용하여 이 작업을 수행 할 수 있습니다 .

#!/usr/bin/ksh
set $(iostat)
myvar=6
eval "echo \${$myvar}"

$myvar가 "6"으로 대체되도록 입력한 문자열을 큰따옴표로 묶고 문자열 "$6"을 얻 eval도록 바깥쪽 달러 기호를 백슬래시 하는 것이 요령입니다 .eval

"%user"라는 출력을 얻었지만 다중 프로세서 RHEL 시스템에서 시도했습니다.

답변2

간접변수 참조

최신 고급 쉘에는 이름이 다른 변수에 저장된 변수의 값을 참조하는 방법이 있습니다. 불행히도 방법은 ksh, bash 및 zsh마다 다릅니다.

myvarmksh ≥R39b에서는 nameref를 만들 수 있습니다 .

typeset -n myvar=6
echo "$myvar"

이는 위치 매개변수에 대한 이름 참조를 지원하지 않기 때문에 ATT ksh93에서는 작동하지 않습니다. 변수 이름이 포함된 변수가 있는 경우 이 방법을 사용할 수 있습니다.

foo=bar
typeset -n myvar=foo
echo "$myvar"  # prints bar

bash≥2.0에서는 다음과 같이 작성할 수 있습니다.

echo "${!myvar}"

zsh에서는 이렇게 쓸 수 있습니다

echo ${(P)myvar}

ksh88 및 pdksh를 포함한 이전 쉘에서 다른 변수의 이름을 포함하는 변수가 있고 해당 변수의 값을 사용하려는 경우 eval유일한 방법은 다음과 같습니다.브루스 에디거(Bruce Ediger)가 설명하듯이. 이 솔루션은 모든 Bourne/POSIX 쉘에서 작동합니다.

eval "value=\${$myvar}"
echo "$value"

배열 사용

이것이 가장 좋은 방법입니다. 더 간단하고 이식성이 뛰어납니다.

사용 사례의 경우 배열(모든 ksh 변형, bash ≥2.0, zsh)이 있는 모든 셸에서 배열 변수에 할당하고 원하는 요소를 가져올 수 있습니다. ksh 및 bash 배열의 번호는 0부터 시작하지만 zsh는 setopt ksh_arrays또는 emulate ksh.

set -A iostat -- $(iostat)
echo "${iostat[5]}"

위치 매개변수를 배열 변수에 복사하려면 다음을 수행하십시오 a.

set -A a -- "$@"

ksh93, mksh ≥R39b, bash ≥2.0 및 zsh에서는 배열 할당 구문을 사용할 수 있습니다.

iostat=($(iostat))
echo "${iostat[5]}"

답변3

Gilles( bash답변의 일부를 제공한 사람)가 지적했듯이 이는 Bruce Ediger(휴대용 작업에 사용하는 방법)를 무효화하지 않습니다. 이는 eval최근에 사용된 방식입니다(그리고 @Gilles가 언급한 대로 AT&T ksh93 제외). - namerefs)는 참조될 수 없습니다. AT&T ksh의 위치 매개변수는 명명된 매개변수만 참조할 수 있습니다.namerefmksh

#!/bin/mksh
set -- $(iostat)
nameref myvar=6
echo $myvar

또한 저항을 향상시키기 위해 --이후에 추가되었습니다 set.

답변4

배열의 또 다른 용도

한동안 ksh나 어떤 변형도 사용하지 않았기 때문에 ksh(또는 bash)에 비슷한 기능이 있는지 잘 모르겠습니다. 내 기본 쉘은 zsh입니다. 다음과 같은 명령의 출력을 처리할 때 배열을 사용합니다.iostat여러 줄을 생성하고 모든 줄의 형식/길이가 동일하지 않기 때문입니다.

#! /bin/zsh
IOStatOutput=("${(@f)$(iostat)}") # Produces one element per line

위의 내용은 위치 매개변수의 사용도 우회합니다. 이제 다양한 장치를 생성하려면 다음을 수행하십시오.

for Element in {7..${#IOStatOutput}} # Devices listed in elements 7 thru the last
do
    DevList+=( ${${=IOStatOutput[Element]}[1]} )
done

작은 덩어리가 작업하기 더 쉽다는 것을 알았습니다. 코드에 따라 간접 변수 참조를 사용해야 할 수도 있고 필요하지 않을 수도 있습니다. 그것이 어떻게 작동하는지 아는 것이 여전히 좋습니다. 나는 그것을 직접 사용합니다.

관련 정보