首页 > 解决方案 > 从变量中提取 UUID/PARTUUID 的 BASH 脚本

问题描述

我正在尝试开发一个 bash 设置脚本,其中包括安装和迁移引导驱动器。我已经完成了大部分工作,但想用驱动器和数字填充我的/boot/cmdline.txtfstab文件。UUIDPARTUUID

我基本上设置了一个变量,其输出为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/sda1UUID 的值,另一个用于相同的驱动器 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"

标签: regexlinuxbash

解决方案


这里不需要循环。

$ 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 表达式中的条件。


推荐阅读