我试图通过 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:
当nameref varref=$i 时,varref 引用$i 命名的变量。这表示该变量(如A、B等)被用作varref的别名。实际上,您在修改 varref 时正在访问它所引用的变量。接下来,通过将变量名称 i 分配给变量和值 varref 来创建参数字符串。
-p "A=var1" -p "B=var2" -p "C=var3" -p "D=var4"
这应该使您的脚本更安全,并且可能通过生成预期结果而不需要 eval 来减少出错的可能性。您的脚本走在正确的轨道上。但是,您需要进行一些小的调整才能正确引用循环内的变量值。这是脚本的修改版本。
看起来您正在尝试在字符串中构建选项列表。对于这种事情使用数组更安全:
输出