繁体   English   中英

Bash-将变量分配给循环中的命令输出

[英]Bash - assign variables to output of a command in a loop

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

./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循环的许多组合,但似乎并没有取得进展。 谢谢!

怎么样:

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 dv | while read dv循环遍历前一个命令的输出,每行读取2个值。 basename $d给我设备的基本名称,$ v包含与设备关联的卷。 这被分配给用declare -A volumes声明的volumes关联数组。 while循环在子外壳程序中运行并打印volumes[sda]=...eval在当前外壳程序中对此进行评估,实际上是在分配值。

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

编辑

  • 修改了while循环,以呼应分配并eval整个事情(以避开由管道生成的子外壳。

  • 添加了用法信息

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

source <(
    ./show-devices 192.168.1.2 |
    sed -rn '/volume/{s#/dev/([^[:space:]]+)[[:space:]]+#\1=#;p}'
)

这将运行您的命令,将其传递给sed以将其格式化为类似于外壳分配的格式,然后使用进程替换将输出像将其视为源于当前外壳的文件一样对待。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM