나는 이것이 비교적 간단하다고 확신합니다. 나는 그것을 어떻게 해야할지 모르겠습니다.
#!/usr/bin/ksh
set `iostat`
myvar=6
나는 이것을 원한다 . 나는 그것을 -> -> echo ${$myvar}
로 해석하고 싶다.${$myvar}
${6}
value
답변1
eval
ksh를 포함하여 많은 좋은 쉘에 내장된 쉘을 사용하여 이 작업을 수행 할 수 있습니다 .
#!/usr/bin/ksh
set $(iostat)
myvar=6
eval "echo \${$myvar}"
$myvar가 "6"으로 대체되도록 입력한 문자열을 큰따옴표로 묶고 문자열 "$6"을 얻 eval
도록 바깥쪽 달러 기호를 백슬래시 하는 것이 요령입니다 .eval
"%user"라는 출력을 얻었지만 다중 프로세서 RHEL 시스템에서 시도했습니다.
답변2
간접변수 참조
최신 고급 쉘에는 이름이 다른 변수에 저장된 변수의 값을 참조하는 방법이 있습니다. 불행히도 방법은 ksh, bash 및 zsh마다 다릅니다.
myvar
mksh ≥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의 위치 매개변수는 명명된 매개변수만 참조할 수 있습니다.nameref
mksh
#!/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
작은 덩어리가 작업하기 더 쉽다는 것을 알았습니다. 코드에 따라 간접 변수 참조를 사용해야 할 수도 있고 필요하지 않을 수도 있습니다. 그것이 어떻게 작동하는지 아는 것이 여전히 좋습니다. 나는 그것을 직접 사용합니다.