2015-11-05 93 views
0

我是shell腳本編程的新手......任何人都可以告訴我如何在第一個'if'語句中檢查數組的第一個元素嗎?它似乎讓我成爲一個整數以外的東西。檢查bash shell腳本中的數組索引

#! /bin/bash 

namelist=($(lsblk -d -n -o NAME)) 
sizelist=($(lsblk -d -n -o SIZE)) 
seriallist=($(lsblk -d -n -o SERIAL)) 

IFS=$'\n' 
modellist=($(lsblk -d -n -o MODEL)) 

echo "*********** HARD DRIVE DATA SCRIPT ***********" 
echo "This script lets you choose the hard drives" 
echo " " 
echo "********************************************" 
echo "* Step one: Choose your hard drive   *" 
echo "********************************************" 

for i in "${namelist[@]}" 
do 
    if [ "$i" -eq "0" ] 
    then 
     echo "First hard drive:" 
    else 
     echo "Next hard drive:" 
    fi 
    echo "* Size: ${sizelist[$i]}B" 
    echo "* Model: ${modellist[$i]}" 
    echo "* Serial number: ${seriallist[$i]}" 
    echo "* Linux device name: ${namelist[$i]}" 
    echo "* Partition List:" 
    echo "Number Name Formatted as" 
    lsblk -n -o NAME,LABEL,FSTYPE /dev/${namelist[$i]} | tail -n +2 
    ((i++)) 
done 
+2

for循環將循環遍歷元素,即在第一次迭代中'i = $ {namelist [0]}'而不是'i = 0'如果您想遍歷索引,請使用'for i in' $ {!namelist [@]}「' –

回答

1
i=0 
for item in "${namelist[@]}" 
do 
    echo $item # so you can see what your assumption actually is 
    if [ "$i" -eq "0" ] 
    then 
     echo "First hard drive:" 
    else 
     echo "Next hard drive:" 
    fi 
    echo "* Size: ${sizelist[$i]}B" 
    echo "* Model: ${modellist[$i]}" 
    echo "* Serial number: ${seriallist[$i]}" 
    echo "* Linux device name: ${namelist[$i]}" 
    echo "* Partition List:" 
    echo "Number Name Formatted as" 
    lsblk -n -o NAME,LABEL,FSTYPE /dev/${namelist[$i]} | tail -n +2 
    ((i++)) 
done 

你混淆了語法。 item在這裏指的是數組中的每個元素,而不是我的計數器。請注意,除非您爲每個最終使用的設備製作序列號,否則它將不起作用,您可能不會這樣做。換句話說,您假設您生成的每個數組的計數是相同的,但這不一定是這種情況。在我的系統中,我得到了0個串行結果,例如,無論是作爲root還是普通用戶。我知道獲取連續序列的唯一方法比你在這裏要複雜得多,因此我不會嘗試描述它,並且它也不會總是爲每個器件的序列號返回值。

另外請注意,您將得到fdx和srx的結果,這個邏輯即軟盤驅動器和光驅,您可能不想要。

我也測試過了,順便說一句,LABEL FSTYPE也什麼都沒有。所以這種方法不適用於Debian類型的系統,我不能爲其他人說話。

如果你使用:

for i in "${!namelist[@]}" 

那麼你就不會使用((我+ +)),而如果沒有其他變化的我時,才需要。

這會更好地使用awk,它旨在創建此類報表,但這超出了您的問題範圍。

+0

我一直在使用lsblk處理大約30-40個硬盤,而且我總是得到一個序列號......但我會記住這一點,並相應地更改我的代碼。我知道另一種做法是smartctl -a | grep「Serial」 – user3856804

+0

除非您只想學習經驗,否則您始終可以使用inxi -Dxxx獲取連續和磁盤信息。 – Lizardx