Shell 脚本 - 如何在循环中显示变量名称及其值

问题描述 投票:0回答:2

我试图通过 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 但似乎不起作用。它因语法错误而失败。

linux shell unix ksh
2个回答
0
投票

如果您希望避免在脚本中使用 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"
,而不需要评估,可能更不容易出错。


0
投票

您的脚本走在正确的轨道上。但是,您需要进行一些小的调整才能正确引用循环内的变量值。这是脚本的修改版本。

#!/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"
© www.soinside.com 2019 - 2024. All rights reserved.