UPS監視プロジェクトにNUTサーバーを使用しています。私の目標は、コマンドを送信し、それに応答してUPSから状態やその他のパラメータを受け取るシェルスクリプトを作成することです。
例えば
#!/bin/bash
status='upsc myups' # command to get the status of UPS
sleep 1
exit 0
これは私にとってうまくいきますが、「状態」を配列として宣言すると、upsの応答は単一の要素として保存されます。
つまり
#!/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
各引数を配列または変数の個々の要素に分割するには?
助けてください
ありがとう
ベストアンサー1
ここで返されるデータは、1行につき1つ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[@]}"
それでも値を取得できますが、目的の出力に示すように、各値は新しい行に表示されます。