脚本是:
# !/bin/bash
# Dynamic Menu Function
createmenu () {
select selected_option; do # in "$@" is the default
if [ 1 -le "$REPLY" ] && [ "$REPLY" -le $(($#)) ]; then
break;
else
echo "Please make a vaild selection (1-$#)."
fi
done
}
declare -a drives=();
# Load Menu by Line of Returned Command
mapfile -t drives < <(lsblk --nodeps -o name,serial,size | grep "sd");
# Display Menu and Prompt for Input
echo "Available Drives (Please select one):";
createmenu "${drives[@]}"
# Split Selected Option into Array and Display
drive=($(echo "${selected_option}"));
echo "Drive Id: ${drive[0]}";
echo "Serial Number: ${drive[1]}";
较旧的系统没有mapfile
或readarray
,所以我需要将该行转换为可以将lsblk
输出的每一行读取到数组中的替代行。
创建该数组的行是:
mapfile -t drives < <(lsblk --nodeps -o name,serial,size | grep "sd");
3条答案
按热度按时间lnlaulya1#
您可以循环您的输入并将其追加到数组中:
或者,对于您的特定情况:
参见BashFAQ/001可以很好地解释为什么
IFS= read -r
是个好主意:它确保保留空格并且不解释反斜杠序列。h22fl7wq2#
这是我前段时间想出的解决方案。这更好,因为它为不支持Map文件/读数组的旧版本的Bash提供了一个替代函数。
您不需要对代码进行任何更改。它真的很管用!
wgeznvg73#
对于那些在家玩的人来说,这个版本的目标是提供一个
mapfile
,它符合Bash 5的功能,但仍然可以追溯到Bash 3.x: