是否可以在 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,这是系统管理员职业生涯的救命稻草。
我是初学者,母语不是英语,请原谅我的笨拙。
我正在尝试制作一个供个人使用的 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,这是系统管理员职业生涯的救命稻草。