BASH脚本从变量中提取UUID / PARTUUID

时间:2019-11-27 07:29:23

标签: regex linux 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"

我的目标是设置一个变量以捕获UUID的/dev/sda1值,而另一个捕获同一驱动器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"

2 个答案:

答案 0 :(得分:1)

您快到了。 您可以尝试:

pat='^/dev/sda1.* UUID="([^"]+)".* PARTUUID="([^"]+)"'
while IFS= read -r line; do
    if [[ $line =~ $pat ]]; then
        vUUID="${BASH_REMATCH[1]}"
        vPARTUUID="${BASH_REMATCH[2]}"
    fi
done < <(blkid)

结果:

echo "vUUID=$vUUID"
vUUID=493b6467-7b7b-4291-a86d-dea5e842780b

echo "vPARTUUOID=$vPARTUUID"
vPARTUUOID=83122dbb-cacf-4612-9be2-4301a03e8093

希望这会有所帮助。

答案 1 :(得分:1)

这里不需要循环。

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

相关问题