我的问题实际上是一个bash
问题,即使它涉及安装磁盘。
在创建VM的过程中,通过脚本安装了该磁盘:
sudo mount -t ext4 /dev/sdb /data
我想在每次系统启动时都保留它。使此安装变为自动。我了解到我必须为此编辑/etc/fstab
文件:在文件上添加一行。
安装磁盘后,必须运行命令:
$ sudo blkid /dev/sdb
/dev/sdb: UUID="238d1293-918e-42e1-a081-a41f497636d0" TYPE="ext4"
要获取UUID,我需要在我的/etc/fstab
文件上添加以下行:
UUID=238d1293-918e-42e1-a081-a41f497636d0 /data ext4 defaults 0 0
我的问题是:我可以通过bash
解析blkid
命令的结果,从UUID="238d1293-918e-42e1-a081-a41f497636d0"
内容中捕获/dev/sdb: UUID="238d1293-918e-42e1-a081-a41f497636d0" TYPE="ext4"
部分并将其存储到变量中?
答案 0 :(得分:2)
使用参数替换:
uuid=$(sudo blkid /dev/sdb)
uuid=${uuid#*UUID=\"} # Remove from left up to UUID="
uuid=${uuid%%\"*} # Remove from right from the leftmost "
echo "$uuid"
答案 1 :(得分:2)
Bash的内置正则表达式支持适用于任务。在下面的函数中,我们针对正则表达式blkid
测试UUID="([^"]+)"
的输出,如果找到匹配项,则发出匹配组内容(括号内的所有内容):
uuid_for_device() {
local uuid_re blkid_text # Declare our locals so we don't leak into global scope
uuid_re='UUID="([^"]+)"' # Save the regex to a variable; less gotchas this way
blkid_text=$(sudo blkid "$1") || return # Collect the data we're going to match against
[[ $blkid_text =~ $uuid_re ]] && echo "${BASH_REMATCH[1]}" # Emit output if regex matches
}
...将根据给定uuid_for_device /dev/sda
发出所需的UUID,您可以像往常一样将其捕获到变量(sda_uuid=$(uuid_for_device /dev/sda)
)中。
也就是说,对于您的实际用例,最好只使用一种更合适的工具来完成工作:
uuid_for_device() { findmnt -n -o UUID "$1"; }
sda_uuid=$(uuid_for_device /dev/sda)
或者,当然,简单地:
sda_uuid=$(findmnt -n -o UUID /dev/sda)
答案 2 :(得分:1)
使用sed:
YOUR_COMMAND | sed -e 's/.*UUID="\([0-9a-f-]*\)".*/\1/'
您可以使用反引号来存储它:
a=`YOUR_COMMAND | sed -e 's/.*UUID="\([0-9a-f-]*\)".*/\1/'`
echo $a