我试图通过 ksh shell 脚本在 for 循环中显示变量名称及其值。但我不知道该怎么做。我应该为此使用类似 eval 的东西吗?
这是一个示例脚本:
#!/bin/ksh
A=var1
B=var2
C=var3
D=var4
param=""
for i in A B C D
do
param="$param -p \"$i=\$i\""
done
echo "$param"
上述脚本的输出是
-p "A=$i" -p "B=$i" -p "C=$i" -p "D=$i"
。
所需的输出是
-p "A=var1" -p "B=var2" -p "C=var3" -p "D=var4"
我尝试使用 eval 但似乎不起作用。它因语法错误而失败。
如果您希望避免在脚本中使用 eval,您可以在 KornShell (ksh) 中使用不同的方法,这通常是避免安全问题和潜在错误的好习惯。可以使用 Ksh 的 nameref 功能创建对另一个变量的引用,其功能类似于其他编程语言中的指针。
以下是如何更改脚本以便使用 nameref 而不是 eval:
#!/bin/ksh
A=var1
B=var2
C=var3
D=var4
param=""
for i in A B C D
do
nameref varref=$i
param="$param -p \"$i=$varref\""
done
echo "$param"
当 nameref varref=$i 时,varref 引用 $i 命名的变量。这表示该变量(如A、B等)被用作varref的别名。实际上,当您修改 varref 时,您正在访问它所引用的变量。 接下来,您通过将变量名称 i 分配给变量和值 varref 来创建参数字符串。
这应该使您的脚本更安全,并且通过生成预期结果
-p "A=var1" -p "B=var2" -p "C=var3" -p "D=var4"
,而不需要评估,可能更不容易出错。
您的脚本走在正确的轨道上。但是,您需要进行一些小的调整才能正确引用循环内的变量值。这是脚本的修改版本。
#!/bin/ksh
A=var1
B=var2
C=var3
D=var4
param=""
for i in A B C D
do
# You need to use eval to get the value of the variable
eval value=\$$i
param="$param -p \"$i=$value\""
done
echo "$param"