我正在嘗試按照教程將 df -h 讀入陣列。
這是主要資訊命令:
df -h --output='itotal','iavail','target'
輸出如下所示:

為了轉移到陣列的代碼如下所示:
#!/bin/bash
df_info=$(df -h --output='itotal','iavail','target')
readarray -t drives <<< "$df_info"
declare -p drives
結果(重新格式化以提高可讀性):
drives=(
[0]="Inodes IFree Mounted on"
[1]=" 2.0M 2.0M /dev"
[2]=" 2.0M 2.0M /run"
[3]=" 30M 30M /"
[4]=" 2.0M 2.0M /dev/shm"
[5]=" 2.0M 2.0M /run/lock"
[6]=" 2.0M 2.0M /sys/fs/cgroup"
[7]=" 11K 0 /snap/core18/2128"
[8]=" 12K 0 /snap/core20/1081"
[9]=" 0 0 /boot/efi"
[10]=" 474 0 /snap/snapd/13270"
[11]=" 11K 0 /snap/core18/2246"
[12]=" 479 0 /snap/snapd/13640"
[13]=" 12K 0 /snap/core20/1169"
[14]=" 796 0 /snap/lxd/21545"
[15]=" 1.6K 0 /snap/lxd/21029"
[16]=" 30M 30M /mnt/tmp_plot2"
[17]=" 30M 30M /mnt/tmp_plot1"
[18]=" 233M 233M /mnt/plotfield1"
[19]=" 233M 233M /mnt/plotfield2"
[20]=" 233M 233M /mnt/plotfield3"
[21]=" 233M 233M /mnt/plotfield5"
[22]=" 233M 233M /mnt/plotfield_ext"
[23]=" 175M 175M /mnt/plotfield4"
[24]=" 2.0M 2.0M /run/user/1000"$
)
到目前為止,輸出看起來不錯。在下一步中,我想拆分為“Inodes”、“IFree”和“Mounted On”欄位
我實作了以下代碼:
for val in ${drives[@]}; do
printf "printing line: "
echo $val
readarray -t fields <<< "$val"
declare -p fields
printf "printing fields: "
echo $fields
done
預期結果printf "printing line: " && echo $val
類似于:" 2.0M 2.0M /dev"
相反,回圈不是在每一行上運行一次,而是在 df -h 中的每個單詞上運行:
printing line: Inodes
declare -a fields=([0]="Inodes")
printing fields: Inodes
printing line: IFree
declare -a fields=([0]="IFree")
printing fields: IFree
printing line: Mounted
declare -a fields=([0]="Mounted")
printing fields: Mounted
printing line: on
declare -a fields=([0]="on")
printing fields: on
printing line: 2.0M
declare -a fields=([0]="2.0M")
printing fields: 2.0M
printing line: 2.0M
declare -a fields=([0]="2.0M")
printing fields: 2.0M
printing line: /dev
declare -a fields=([0]="/dev")
printing fields: /dev
printing line: 2.0M
declare -a fields=([0]="2.0M")
printing fields: 2.0M
printing line: 2.0M
declare -a fields=([0]="2.0M")
printing fields: 2.0M
printing line: /run
declare -a fields=([0]="/run")
printing fields: /run
printing line: 30M
declare -a fields=([0]="30M")
printing fields: 30M
printing line: 30M
declare -a fields=([0]="30M")
printing fields: 30M
printing line: /
declare -a fields=([0]="/")
printing fields: /
printing line: 2.0M
declare -a fields=([0]="2.0M")
printing fields: 2.0M
printing line: 2.0M
declare -a fields=([0]="2.0M")
printing fields: 2.0M
printing line: /dev/shm
declare -a fields=([0]="/dev/shm")
printing fields: /dev/shm
printing line: 2.0M
declare -a fields=([0]="2.0M")
printing fields: 2.0M
printing line: 2.0M
declare -a fields=([0]="2.0M")
printing fields: 2.0M
printing line: /run/lock
declare -a fields=([0]="/run/lock")
printing fields: /run/lock
printing line: 2.0M
declare -a fields=([0]="2.0M")
printing fields: 2.0M
printing line: 2.0M
declare -a fields=([0]="2.0M")
printing fields: 2.0M
printing line: /sys/fs/cgroup
declare -a fields=([0]="/sys/fs/cgroup")
printing fields: /sys/fs/cgroup
printing line: 11K
declare -a fields=([0]="11K")
printing fields: 11K
printing line: 0
declare -a fields=([0]="0")
printing fields: 0
printing line: /snap/core18/2128
declare -a fields=([0]="/snap/core18/2128")
printing fields: /snap/core18/2128
printing line: 12K
declare -a fields=([0]="12K")
printing fields: 12K
printing line: 0
declare -a fields=([0]="0")
printing fields: 0
printing line: /snap/core20/1081
declare -a fields=([0]="/snap/core20/1081")
printing fields: /snap/core20/1081
printing line: 0
declare -a fields=([0]="0")
printing fields: 0
printing line: 0
declare -a fields=([0]="0")
printing fields: 0
printing line: /boot/efi
declare -a fields=([0]="/boot/efi")
printing fields: /boot/efi
printing line: 474
declare -a fields=([0]="474")
printing fields: 474
printing line: 0
declare -a fields=([0]="0")
printing fields: 0
printing line: /snap/snapd/13270
declare -a fields=([0]="/snap/snapd/13270")
printing fields: /snap/snapd/13270
printing line: 11K
declare -a fields=([0]="11K")
printing fields: 11K
printing line: 0
declare -a fields=([0]="0")
printing fields: 0
printing line: /snap/core18/2246
declare -a fields=([0]="/snap/core18/2246")
printing fields: /snap/core18/2246
printing line: 479
declare -a fields=([0]="479")
printing fields: 479
printing line: 0
declare -a fields=([0]="0")
printing fields: 0
printing line: /snap/snapd/13640
declare -a fields=([0]="/snap/snapd/13640")
printing fields: /snap/snapd/13640
printing line: 12K
declare -a fields=([0]="12K")
printing fields: 12K
printing line: 0
declare -a fields=([0]="0")
printing fields: 0
printing line: /snap/core20/1169
declare -a fields=([0]="/snap/core20/1169")
printing fields: /snap/core20/1169
printing line: 796
declare -a fields=([0]="796")
printing fields: 796
printing line: 0
declare -a fields=([0]="0")
printing fields: 0
printing line: /snap/lxd/21545
declare -a fields=([0]="/snap/lxd/21545")
printing fields: /snap/lxd/21545
printing line: 1.6K
declare -a fields=([0]="1.6K")
printing fields: 1.6K
printing line: 0
declare -a fields=([0]="0")
printing fields: 0
printing line: /snap/lxd/21029
declare -a fields=([0]="/snap/lxd/21029")
printing fields: /snap/lxd/21029
printing line: 30M
declare -a fields=([0]="30M")
printing fields: 30M
printing line: 30M
declare -a fields=([0]="30M")
printing fields: 30M
printing line: /mnt/tmp_plot2
declare -a fields=([0]="/mnt/tmp_plot2")
printing fields: /mnt/tmp_plot2
printing line: 30M
declare -a fields=([0]="30M")
printing fields: 30M
printing line: 30M
declare -a fields=([0]="30M")
printing fields: 30M
printing line: /mnt/tmp_plot1
declare -a fields=([0]="/mnt/tmp_plot1")
printing fields: /mnt/tmp_plot1
printing line: 233M
declare -a fields=([0]="233M")
printing fields: 233M
printing line: 233M
declare -a fields=([0]="233M")
printing fields: 233M
printing line: /mnt/plotfield1
declare -a fields=([0]="/mnt/plotfield1")
printing fields: /mnt/plotfield1
printing line: 233M
declare -a fields=([0]="233M")
printing fields: 233M
printing line: 233M
declare -a fields=([0]="233M")
printing fields: 233M
printing line: /mnt/plotfield2
declare -a fields=([0]="/mnt/plotfield2")
printing fields: /mnt/plotfield2
printing line: 233M
declare -a fields=([0]="233M")
printing fields: 233M
printing line: 233M
declare -a fields=([0]="233M")
printing fields: 233M
printing line: /mnt/plotfield3
declare -a fields=([0]="/mnt/plotfield3")
printing fields: /mnt/plotfield3
printing line: 233M
declare -a fields=([0]="233M")
printing fields: 233M
printing line: 233M
declare -a fields=([0]="233M")
printing fields: 233M
printing line: /mnt/plotfield5
declare -a fields=([0]="/mnt/plotfield5")
printing fields: /mnt/plotfield5
printing line: 233M
declare -a fields=([0]="233M")
printing fields: 233M
printing line: 233M
declare -a fields=([0]="233M")
printing fields: 233M
printing line: /mnt/plotfield_ext
declare -a fields=([0]="/mnt/plotfield_ext")
printing fields: /mnt/plotfield_ext
printing line: 175M
declare -a fields=([0]="175M")
printing fields: 175M
printing line: 175M
declare -a fields=([0]="175M")
printing fields: 175M
printing line: /mnt/plotfield4
declare -a fields=([0]="/mnt/plotfield4")
printing fields: /mnt/plotfield4
printing line: 2.0M
declare -a fields=([0]="2.0M")
printing fields: 2.0M
printing line: 2.0M
declare -a fields=([0]="2.0M")
printing fields: 2.0M
printing line: /run/user/1000
declare -a fields=([0]="/run/user/1000")
printing fields: /run/user/1000
uj5u.com熱心網友回復:
正如 Barmar 指出的那樣用${drives}雙引號括起來,所以整個“行”被讀入變數,val否則該行在空白處被分割并一次處理一個“單詞”。
val正確填充后您將遇到的其他專案:
readarray用于將整行(從檔案)讀入陣列- 我假設您想要做的是將每個“單詞”讀
val入單獨的陣列元素中,在這種情況下...... - 嘗試
read -a拆分val為單獨的陣列元素 - 因為
fields是一個陣列,假設意圖是fields在一行上顯示的所有內容...... - 你想
echo $fields用echo "${fields[@]}" - as is
echo $fields列印內容fields[0]
將所有這些放在一起:
for val in "${drives[@]}"; do
printf "printing line: "
echo $val
read -r -a fields <<< "$val"
# fields=( ${val} ) # alternative to 'read -a'; no double quotes since we *want* word splitting
declare -p fields
printf "printing fields: "
echo "${fields[@]}"
done
產生:
printing line: Inodes IFree Mounted on
declare -a fields=([0]="Inodes" [1]="IFree" [2]="Mounted" [3]="on")
printing fields: Inodes IFree Mounted on
printing line: 2.0M 2.0M /dev
declare -a fields=([0]="2.0M" [1]="2.0M" [2]="/dev")
printing fields: 2.0M 2.0M /dev
printing line: 2.0M 2.0M /run
declare -a fields=([0]="2.0M" [1]="2.0M" [2]="/run")
printing fields: 2.0M 2.0M /run
printing line: 30M 30M /
declare -a fields=([0]="30M" [1]="30M" [2]="/")
printing fields: 30M 30M /
printing line: 2.0M 2.0M /dev/shm
declare -a fields=([0]="2.0M" [1]="2.0M" [2]="/dev/shm")
printing fields: 2.0M 2.0M /dev/shm
printing line: 2.0M 2.0M /run/lock
declare -a fields=([0]="2.0M" [1]="2.0M" [2]="/run/lock")
printing fields: 2.0M 2.0M /run/lock
printing line: 2.0M 2.0M /sys/fs/cgroup
declare -a fields=([0]="2.0M" [1]="2.0M" [2]="/sys/fs/cgroup")
printing fields: 2.0M 2.0M /sys/fs/cgroup
printing line: 11K 0 /snap/core18/2128
declare -a fields=([0]="11K" [1]="0" [2]="/snap/core18/2128")
printing fields: 11K 0 /snap/core18/2128
printing line: 12K 0 /snap/core20/1081
declare -a fields=([0]="12K" [1]="0" [2]="/snap/core20/1081")
printing fields: 12K 0 /snap/core20/1081
printing line: 0 0 /boot/efi
declare -a fields=([0]="0" [1]="0" [2]="/boot/efi")
printing fields: 0 0 /boot/efi
printing line: 474 0 /snap/snapd/13270
declare -a fields=([0]="474" [1]="0" [2]="/snap/snapd/13270")
printing fields: 474 0 /snap/snapd/13270
printing line: 11K 0 /snap/core18/2246
declare -a fields=([0]="11K" [1]="0" [2]="/snap/core18/2246")
printing fields: 11K 0 /snap/core18/2246
printing line: 479 0 /snap/snapd/13640
declare -a fields=([0]="479" [1]="0" [2]="/snap/snapd/13640")
printing fields: 479 0 /snap/snapd/13640
printing line: 12K 0 /snap/core20/1169
declare -a fields=([0]="12K" [1]="0" [2]="/snap/core20/1169")
printing fields: 12K 0 /snap/core20/1169
printing line: 796 0 /snap/lxd/21545
declare -a fields=([0]="796" [1]="0" [2]="/snap/lxd/21545")
printing fields: 796 0 /snap/lxd/21545
printing line: 1.6K 0 /snap/lxd/21029
declare -a fields=([0]="1.6K" [1]="0" [2]="/snap/lxd/21029")
printing fields: 1.6K 0 /snap/lxd/21029
printing line: 30M 30M /mnt/tmp_plot2
declare -a fields=([0]="30M" [1]="30M" [2]="/mnt/tmp_plot2")
printing fields: 30M 30M /mnt/tmp_plot2
printing line: 30M 30M /mnt/tmp_plot1
declare -a fields=([0]="30M" [1]="30M" [2]="/mnt/tmp_plot1")
printing fields: 30M 30M /mnt/tmp_plot1
printing line: 233M 233M /mnt/plotfield1
declare -a fields=([0]="233M" [1]="233M" [2]="/mnt/plotfield1")
printing fields: 233M 233M /mnt/plotfield1
printing line: 233M 233M /mnt/plotfield2
declare -a fields=([0]="233M" [1]="233M" [2]="/mnt/plotfield2")
printing fields: 233M 233M /mnt/plotfield2
printing line: 233M 233M /mnt/plotfield3
declare -a fields=([0]="233M" [1]="233M" [2]="/mnt/plotfield3")
printing fields: 233M 233M /mnt/plotfield3
printing line: 233M 233M /mnt/plotfield5
declare -a fields=([0]="233M" [1]="233M" [2]="/mnt/plotfield5")
printing fields: 233M 233M /mnt/plotfield5
printing line: 233M 233M /mnt/plotfield_ext
declare -a fields=([0]="233M" [1]="233M" [2]="/mnt/plotfield_ext")
printing fields: 233M 233M /mnt/plotfield_ext
printing line: 175M 175M /mnt/plotfield4
declare -a fields=([0]="175M" [1]="175M" [2]="/mnt/plotfield4")
printing fields: 175M 175M /mnt/plotfield4
printing line: 2.0M 2.0M /run/user/1000$
declare -a fields=([0]="2.0M" [1]="2.0M" [2]="/run/user/1000\$")
printing fields: 2.0M 2.0M /run/user/1000$
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/344778.html
