代码之家  ›  专栏  ›  技术社区  ›  sk123

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

  •  0
  • sk123  · 技术社区  · 1 年前

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

    2 回复  |  直到 1 年前
        1
  •  0
  •   Pointless    1 年前

    如果您希望避免在脚本中使用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来创建param字符串。

    这应该会使您的脚本更安全,并且通过生成预期的结果, -p "A=var1" -p "B=var2" -p "C=var3" -p "D=var4" ,而不需要eval。

        2
  •  0
  •   Muhammad Ahsan    1 年前

    你的剧本走在了正确的轨道上。但是,您需要进行一个小的调整,以正确地引用循环中的变量值。这是你的脚本的修改版本。

    #!/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"