簡體   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