我敢肯定它相对简单,我只是不知道该怎么做。
#!/usr/bin/ksh
set `iostat`
myvar=6
我想要某种echo ${$myvar}
我想解释为${$myvar}
-> ${6}
->的东西value
我敢肯定它相对简单,我只是不知道该怎么做。
#!/usr/bin/ksh
set `iostat`
myvar=6
我想要某种echo ${$myvar}
我想解释为${$myvar}
-> ${6}
->的东西value
Answers:
您可以使用eval
内置到许多精美的shell中(包括ksh)来执行此操作:
#!/usr/bin/ksh
set $(iostat)
myvar=6
eval "echo \${$myvar}"
技巧是对输入的字符串加双引号,eval
以便$ myvar替换为“ 6”,并反斜杠外部的美元符号,从而eval
得到字符串“ $ 6”。
我得到了“%user”作为输出,但是我在多处理器RHEL机器上尝试了它。
vv=$( eval "echo \$$vn" )
。万分感谢!
现代高级Shell提供了一种引用变量名称的方法,该变量的名称存储在另一个变量中。不幸的是,ksh,bash和zsh的方法不同。
在mksh≥R39b中,您可以myvar
命名:
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}
在较旧的shell(包括ksh88和pdksh)中,只有拥有包含另一个变量名称的变量并想要使用该变量的值时,这才是唯一的手段eval
,如Bruce Ediger所述。该解决方案可在任何Bourne / POSIX shell中使用。
eval "value=\${$myvar}"
echo "$value"
这是最好的方法:更简单,更可移植。
对于您的用例,在任何具有数组的shell中(所有ksh变体,bash≥2.0,zsh),您都可以分配给数组变量并采用所需的元素。注意,ksh和bash数组从0开始编号,但是zsh从1开始编号,除非您发出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]}"
eval "vv=\${$vn}"
。谢谢您,先生。
正如Gilles(提供bash
答案的一部分)所指出的那样,也没有使Bruce Ediger的(使之可移植eval
)失效,这是nameref
最近的方法mksh
(以及AT&T ksh93),除了– @Gilles评论– namerefs不能引用AT&T ksh中的位置参数,只能引用命名参数):
#!/bin/mksh
set -- $(iostat)
nameref myvar=6
echo $myvar
也增加了--
after功能,set
以提高抵抗力。
typeset: 6: invalid variable name
)。
一段时间未使用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
我发现较小的块更容易处理。您可能需要也可能不需要使用间接变量引用,具体取决于您的代码。了解其工作原理仍然是一件好事。我自己用。