【问题标题】:bash - How to create a disk/partition menu?bash - 如何创建磁盘/分区菜单?
【发布时间】:2023-03-18 15:50:02
【问题描述】:

我尝试了unix.com 的一些代码,将其修改为设备选择器。

#!/bin/bash
count=0
for device in `fdisk -l | sed -n '/^[/]/p' | awk '{print $1}'`
do
  count=$((count+1))
  dev[$count]=$device
  echo "$count: $device"
done
echo "Select volume (numbers 1-$count):"
read selected_number
selected_device=$dev[$selected_number] 
echo "The device you selected is: $selected_device"

由于某种原因,selected_device=$dev[$selected_number] 行没有按预期工作。 我想我犯了一些初学者的语法错误。

它给出的输出是

1: /dev/nvme0n1p1
2: /dev/nvme0n1p2
3: /dev/nvme0n1p3
4: /dev/nvme0n1p4
5: /dev/nvme0n1p5
6: /dev/nvme0n1p6
7: /dev/nvme0n1p7
8: /dev/mmcblk0p1
Select volume (numbers 1-8):
5
The device you selected is: [5]

虽然我希望像The device you selected is: /dev/nvme0n1p5

(我以 sudo 运行脚本,顺便说一句)

提前感谢您的帮助。

【问题讨论】:

  • 试用:selected_device=${dev[$selected_number]}
  • 不要自己实现select逻辑,而是使用bash的select:help select

标签: linux bash sh


【解决方案1】:

类似的,

#!/usr/bin/env bash

count=0

for device in `fdisk -l | sed -n '/^[/]/p' | awk '{print $1}'`; do
  count=$((count+1))
  dev[$count]=$device
  printf '%s: %s\n' "$count" "$device"
done

read -rp "Select volume (numbers 1-$count): " selected_number

printf 'The device you selected is: %s\n' "${dev[$selected_number]}"

虽然我建议使用while + read 循环和Process Substitution.

while IFS= read -r device; do
  count=$((count+1))
  dev[$count]=$device
  printf '%s: %s\n' "$count" "$device"
done < <(fdisk -l | sed -n '/^[/]/p' | awk '{print $1}')

sedawk 部分也可以只是一个 awk

fdisk -l | awk '/^[/]/{print $1}'

【讨论】:

  • 好的,非常感谢,但我想将结果保存到变量中。最后的“回声”只是为了测试脚本
  • @DavidePacchiarotti,你的意思是像variable=${dev[$selected_number]}
  • 好的,我错过了 {} 括号,谢谢!现在可以了!
猜你喜欢
  • 2021-08-02
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 2015-01-05
  • 2011-01-09
  • 2013-06-28
相关资源
最近更新 更多