Shell-Script

字元串操作 Shell 腳本

  • May 25, 2016

我正在使用 NUT 伺服器進行 UPS 監控項目。我的目標是製作一個發送一個命令並作為響應從 UPS 接收狀態和其他參數的 shell 腳本。

例如

#!/bin/bash
status='upsc myups' # command to get the status of UPS
sleep 1
exit 0

這對我來說很好,但是如果我將“狀態”聲明為數組,則來自 ups 的響應將儲存為單個元素

IE

#!/bin/bash
declare -a status #declare status as array
# command
status=$(upsc myups)  or status=`upsc myups`
#number of array elements
echo ${status[@]}
exit 0

狀態數組中的元素數:

1

終端輸出/陣列輸出

echo ${#status[1]}

如果我回顯數組,輸出如下所示:

Init SSL without certificate database
battery.capacity: 9.00 battery.charge: 90 battery.charge.low: 20                                                                 
battery.charge.restart: 0 battery.energysave: no battery.protection: yes  
ups.shutdown: enabled ups.start.auto: yes ups.start.battery: yes   
ups.start.reboot: yes ups.status: OL CHRG ups.test.interval: 604800 
ups.test.result: Done and passed ups.timer.shutdown: -1     
ups.timer.start: -1   
ups.type: offline / line interactive ups.vendorid: 0463

因為這整個輸出保存在“狀態”數組的單個元素中。我在為日誌目的單獨使用所有參數時遇到了麻煩。

期望的輸出:

battery.capacity: 9.00
battery.charge: 90 
battery.charge.low: 20                                                                 
battery.charge.restart: 0
battery.energysave: no 
battery.protection: yes

如何將每個參數分成數組或變數的單個元素?

請幫忙

謝謝

您從中獲取的數據upsc的格式為keyword: value,每行一個。您可以通過它sed來獲取表單[keyword]="value",然後使用它來初始化關聯數組:

declare -A status="($(upsc myups | sed 's/\(.*\): \(.*\)/ [\1]="\2"/'))"

現在您可以獲得任何關鍵字的值,例如echo "${status[device.model]}". 您可以遍歷所有鍵和值並執行您想要的操作:

for key in "${!status[@]}"
do    echo "$key: ${status[$key]}"
done

請注意,如果您引用您的價值觀,

status="$(upsc myups)"
echo "${status[@]}"

你仍然會得到一個值,但每個值都將在一個新行上,就像你想要的輸出一樣。

引用自:https://unix.stackexchange.com/questions/285256