regex - 从变量中提取 UUID/PARTUUID 的 BASH 脚本
问题描述
我正在尝试开发一个 bash 设置脚本,其中包括安装和迁移引导驱动器。我已经完成了大部分工作,但想用驱动器和数字填充我的/boot/cmdline.txt
和fstab
文件。UUID
PARTUUID
我基本上设置了一个变量,其输出为blkid
:
disk=$(blkid)
echo "${disk}"
RESULT:
/dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="69D5-9B27" TYPE="vfat" PARTUUID="d9b3f436-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="24eaa08b-10f2-49e0-8283-359f7eb1a0b6" TYPE="ext4" PARTUUID="d9b3f436-02"
/dev/sda1: LABEL="usbfs" UUID="493b6467-7b7b-4291-a86d-dea5e842780b" TYPE="ext4" PARTUUID="83122dbb-cacf-4612-9be2-4301a03e8093"
/dev/mmcblk0: PTUUID="d9b3f436" PTTYPE="dos"
我的目标是设置一个变量来捕获/dev/sda1
UUID 的值,另一个用于相同的驱动器 PARTUUID。我的基本前提是做这样的事情(基于能够在python中做到这一点:
#sudo code#
Disk=diskInfo
While line in Disk; do
If Line contains /dev/sda1
Then
Do some Regex to set vUUID = "493b6467-7b7b-4291-a86d-dea5e842780b"
Do some Regex to set vPARTUUID = "83122dbb-cacf-4612-9be2-4301a03e8093"
我想我想要这样的东西 - - 但不能让它工作:
disk=$(blkid)
while read line; do
if [[ $line == '/dev/sda1'* ]]; then
if [[ $line =~ UUID=(["'])(?:(?=(\\?))\2.)*?\1 ]]; then #captures too much
vUUID=${BASH_REMATCH[1]}
fi
if [[ $line =~ PARTUUID=(["'])(?:(?=(\\?))\2.)*?\1 ]]; then #captures too much
vPARTUUID=${BASH_REMATCH[1]}
fi
fi
done <<< "$disk"
解决方案
这里不需要循环。
$ IFS=\" read -r _ vUUID _ vPARTUUID _ < <(blkid /dev/sda1 -s UUID -s PARTUUID)
$
$ echo $vUUID
9099-AD46
$
$ echo $vPARTUUID
90afc43c-5b4d-4721-b82a-000e585fef62
如果没有这样的磁盘,read
将会以非零退出状态静默失败;因此您可以将其用作 if-else 表达式中的条件。
推荐阅读
- python - 需要使用键值对创建字典的 Python 级别结构
- javascript - 使用 JavaScript 后 URL 未加载
- python - 将文件从公共目录移动到具有相同名称的不同文件夹
- python - 如何使用 python 读取 POST 请求内容
- python - 当模块已经安装时,获取烧瓶失败导入烧瓶-mysqldb的错误
- python - 无法加载keras的模型
- python - 我将如何下载 stackoverflow android 数据集?
- node.js - Firebase 实时数据库事务处理程序大部分时间被调用两次
- java - 如何从android中的两个文本框之一获取输入?
- python - 如果代理不工作或python出错,如何确保请求失败?