gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:22:46 25 4
gpt4 key购买 nike

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

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

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

编辑:

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

  • 添加了使用信息

  • 添加问题中的精确解

关于linux - Bash - 将变量分配给循环中命令的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16972957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com