[英]Checking array indices in bash shell scripting
我是Shell腳本的新手...任何人都可以告訴我如何檢查我是否在第一個'if'語句中位於數組的第一個元素上嗎? 似乎使我變成了整數以外的東西。
#! /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
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
您正在混淆語法。 項目在這里是指數組的每個元素,而不是計數器。 請注意,除非獲得最終使用的每個設備的序列號,否則它將無法正常工作。 換句話說,您假設生成的每個數組的計數都是相同的,在這里不一定是這種情況。 例如,以root用戶或普通用戶身份獲得的串行系統結果為0。 我知道獲取序列號的唯一方法比這里要復雜得多,因此我不會嘗試對其進行描述,並且它也不會總是為每個設備返回序列號的值。
還要注意,使用這種邏輯,即可能不需要的軟盤驅動器和光盤驅動器,您將獲得fdx和srx的結果。
我也進行了測試,順便說一句,LABEL FSTYPE也一無所獲。 因此,這種方法在Debian類型系統上不起作用,我不能為別人說。
如果要使用:
for i in "${!namelist[@]}"
那么您就不會使用((i ++)),只有在沒有其他改變i的情況下才需要。
使用awk可以更好地工作,awk旨在創建此類報告,但這不在您的問題范圍內。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.