[英]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.