【问题标题】:Bash - assign variables to output of a command in a loopBash - 将变量分配给循环中的命令输出
【发布时间】:2013-06-06 22:02:08
【问题描述】:

我有一个应用程序可以运行并定义系统上的设备。输出如下所示:

./show-devices 192.168.1.2 | grep volume

/dev/sda        volumeid-65
/dev/sdb        volumeid-81
/dev/sdc        volumeid-92

我想要做的是在循环中运行应用程序并像这样分配变量:

sda=volumeid-65
sdb=volumeid-81
sdc=volumeid-92

然后,稍后可以在脚本中使用 $sda、$sdb 和 $sdc 变量。并非所有输出都相同。有些机器只有一卷,有些机器会有更多。欢迎所有建议。我尝试了许多 for 循环的组合,但似乎没有得到任何结果。谢谢!

【问题讨论】:

    标签: linux bash for-loop associative-array


    【解决方案1】:

    怎么样:

    eval `./show-devices 192.168.1.2 | grep volume | while read d v ;do
        echo $(basename $d)=$v
    done`
    

    但是,您不能确定变量的名称。所以最好使用关联数组:

    # declare the array
    declare -A volumes
    
    # Assign values to the array
    eval `./show-devices 192.168.1.2 | grep volume | while read d v ;do
        echo volumes[$(basename $d)]=$v
    done`
    
    # Use the array
    for i in "${!volumes[@]}"; do
        echo "Key:$i , Value:${volumes[$i]}"
        # Declare all the variables with the values as asked by question
        eval $i=${volumes[$i]}
    done
    

    说明| while read d v 循环上一个命令的输出,每行读取 2 个值。 basename $d 给了我设备的基本名称,$v 包含与设备关联的卷。这被分配到用declare -A volumes 声明的volumes 关联数组中。 while 循环在子 shell 中运行并打印 volumes[sda]=...eval 在当前 shell 中评估它,实际分配值。

    用法for 循环是一个用法示例。 "${!volumes[@]}"volumes 数组的键列表,for 循环遍历它们并打印与 volumes 数组中每个键关联的值。

    编辑

    • 修改了while 循环以回显分配和eval 整个事情(绕过由管道生成的子shell。

    • 添加了使用信息

    • 添加了有问题的确切解决方案

    【讨论】:

    • 你试过那个代码了吗? bash 将在子shell 中执行while...;当管道终止时,子shell及其相关变量也会终止。
    • @rici 你是对的。更改解决方案以绕过子外壳。
    • 谢谢。以后如何引用或调用数组以使用其中的项目?
    • @MikeD 第二个循环(for 循环)是如何使用volumes 数组的示例。我还根据 rici 的建议修改了解决方案。
    • @Samveen 我现在看到了。但是,这是否分配了一个变量?我的输出在 shell 中如下所示: sdc : volumeid-92 sdb : volumeid-81 sda : volumeid-65 我想做的是使用 $sda、$sdb 和 $sdc 作为分配给其相应卷标识符的变量同一行。
    【解决方案2】:
    source <(
        ./show-devices 192.168.1.2 |
        sed -rn '/volume/{s#/dev/([^[:space:]]+)[[:space:]]+#\1=#;p}'
    )
    

    这会运行您的命令,将其传递给 sed 以将其格式化为 shell 分配,然后使用进程替换将输出视为源自当前 shell 的文件。

    【讨论】:

      猜你喜欢
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 2011-01-19
      • 1970-01-01
      • 2017-11-01
      • 2012-02-23
      相关资源
      最近更新 更多