我正在尝试开发一个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"
我的目标是设置一个变量以捕获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"
答案 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表达式中的条件。