在bash shell脚本中检查数组索引

时间:2015-11-05 23:18:56

标签: arrays bash shell

我是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

1 个答案:

答案 0 :(得分: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[@]}"

然后你不会使用((i ++)),只有在没有其他任何改变时才需要。

使用awk可以更好地工作,awk旨在创建此类报告,但这不在您的问题范围内。