2019年1月25日 星期五

[shell script] 迴圈中,動態變數名稱的使用方法與限制

在Linux4.14.12的環境下

今天我要寫一個Script可以去判斷3顆硬碟的sata速度是否為6.0 Gbps,目前已知Linux底下讀sata硬碟速度的device位置分別為(每台電腦的/sys/class/ata_link/link7/sata_spd  紅字部分會不相同):
        HDD1  ===> /sys/class/ata_link/link7/sata_spd
        HDD2  ===> /sys/class/ata_link/link8/sata_spd
        HDD3  ===> /sys/class/ata_link/link9/sata_spd



完整script寫法,動態變數的方法,如下方粗體字部分:
=================== check_sata_speed.sh ==================
#!/bin/sh
HDD1="7"
HDD2="8"
HDD3="9"

BAY_3=3
i=1

        HDDSPD1=`cat /sys/class/ata_link/link$HDD1/sata_spd | awk -F' ' '{print $1}'`
        HDDSPD2=`cat /sys/class/ata_link/link$HDD2/sata_spd | awk -F' ' '{print $1}'`
        HDDSPD3=`cat /sys/class/ata_link/link$HDD3/sata_spd | awk -F' ' '{print $1}'`

        while [ $i -le $BAY_3 ]
        do
                eval "HDD_SPD=\$HDDSPD$i"
                if [ "6.0" == "$HDD_SPD" ]; then
                        count=$(($count+1))
                else
                        echo "HDD$i Fail"
                fi
                i=$(($i+1))
        done

        if [ $count == $BAY_3 ]; then
                echo "OK"
        fi
=========================================================
如果三顆硬碟都為6.0 Gbps 則最後印出 OK
若是有低於6.0的速度,則會印出Fail


***注意動態變數的使用限制
上面的HDDSPD1~HDDSPD3變數,若是你宣告為 HDD1_SPD ~ HDD3_SPD,則在迴圈內使用(eval "HDD_SPD=\$HDD$i_SPD")動態變數時,是不會成功的,只有把動態變數的數字放在變數名稱最後,才會work

已上~



沒有留言:

張貼留言