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