0

我有一个应用程序可以运行并定义系统上的设备。输出看起来像这样:

./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 循环的组合,但似乎没有得到任何结果。谢谢!

4

2 回答 2

2

怎么样:

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 包含与设备关联的卷。这被分配到用volumes声明的关联数组中declare -A volumeswhile循环在子 shell 中运行并在当前 shell 中打印和评估它,实际分配值volumes[sda]=...eval

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

编辑

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

  • 添加了使用信息

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

于 2013-06-06T22:14:20.820 回答
1
source <(
    ./show-devices 192.168.1.2 |
    sed -rn '/volume/{s#/dev/([^[:space:]]+)[[:space:]]+#\1=#;p}'
)

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

于 2013-06-06T23:38:57.770 回答