是否可以在 bash 中列出磁盘?

Is it possible to make a list of disk in bash?

我是初学者,母语不是英语,请原谅我的笨拙。

我正在尝试制作一个供个人使用的 linux 安装脚本(并了解有关 linux 和 bash 脚本的更多信息),但我正在努力寻找一种方法创建磁盘选择菜单:

我希望制作一个列表 看起来像这样:

NAME    SIZE    DEVICES
sda     256gib  intel-ssdx
sdb     1000gib TLxxxxxxxx
nvme0n1 128gib  WDxxxxxxxx

到目前为止,我已经尝试在文本文件中回显 fdisk -l 和 lsblk 并使用 cat 来提示它

代码:

lsblk
Set DiskLayout=("Automatic Install" "Manual Install" "Check pending change" "Quit")
select DiskLayoutopt in "${DiskLayout[@]}"
do
    case $DiskLayoutopt in
        "Automatic Install")
            read Sdsk -p "Select drive"
            ;;
        "Manual Install")
            parted -a optimal
            ;; 
        "Check pending change")
            echo ""
        "Quit")
            exit 1
            ;;
        *) echo "invalid option $REPLY";;
    esac
done

以下代码将获取您的菜单:

#!/usr/bin/env bash

disk=()
size=()
name=()
while IFS= read -r -d $'[=10=]' device; do
    device=${device/\/dev\//}
    disk+=($device)
    name+=("`cat "/sys/class/block/$device/device/model"`")
    size+=("`cat "/sys/class/block/$device/size"`")
done < <(find "/dev/" -regex '/dev/sd[a-z]\|/dev/vd[a-z]\|/dev/hd[a-z]' -print0)

for i in `seq 0 $((${#disk[@]}-1))`; do
    echo -e "${disk[$i]}\t${name[$i]}\t${size[$i]}"
done

这是一个难懂的 bash 脚本...希望您能快点学会。 这里有一些帮助:

第一行是一个 shebang,告诉您的系统该脚本需要哪个解释器。实际上,此脚本仅适用于 bash。 在无法运行的系统(即 BSD)上尝试 运行 bash myscript.sh。

variable=()是一个数组。

向该数组添加内容由 variable+=("my value")

完成

while 循环从 find 命令获得的内容中读取变量设备

while read device; do
    something
done < <(find)

find 命令使用正则表达式表示任何类似 /dev/sdX 的内容,其中 X 从 a 到 z,或任何类似 /dev/vdX 或类似 /dev/hdX 的内容(其中 X 仍然从A到Z)。 or 运算符是一个管道 | ,必须使用反斜杠进行转义,因此给出 \|.

同时读取的设备看起来像“/dev/sda”,因此我们需要使用以下命令从中删除“/dev/”:

device=${device/\/dev\//}

这是一个 bash 替换,其工作方式如下:

variable="my foo function"
echo ${variable/foo/bar}

这会输出 my bar function。 事实上,我们仍然需要转义 / 因为这是替换的分隔符,所以它变成了 \/.

通过

获取磁盘名称
"`cat "/sys/class/block/$device/device/model"`"

cat "/sys/class/block/sda/device/model"给出磁盘型号。 为了将结果放入变量中,我们需要用`符号将其引用,例如:

myvar=`cat /var/file`

最后但同样重要的是,for 循环部分:

我在seq 0 $((${#disk[@]}-1));做 echo -e "${磁盘[$i]}\t${名称[$i]}\t${大小[$i]}" 完成

${#disk[@]}为阵列盘的元素个数。 实际上 ${#var} 是 var 中元素的个数,当它是一个字符串时,就是字符个数。 ${var[@]}表示数组的所有元素。

seq 0 X returns 0 到 X 数字的序列,以构造 for 循环。

使用 echo -e 将转义字符转换为文字。在我们的例子中,'\t' 变成了制表符。 最后但同样重要的是,显示 ${disk[$i]} 是索引 $i 的磁盘阵列值,其中 $i 是一个整数。

顺便说一句,bash 完成这些任务非常有限,但首先学习真的很有趣。 使用更高级别的脚本语言(如 Python)可能会更好地完成更艰巨的任务。无论如何,祝你学习愉快bash,这是系统管理员职业生涯的救命稻草。