解析bash命令结果的一部分以将其存储到变量中

解析bash命令结果的一部分以将其存储到变量中,bash,Bash,我的问题实际上是一个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" 要获取

我的问题实际上是一个
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
命令的结果,从
/dev/sdb:UUID=“238d1293-918e-42e1-a081-a41f49763d0”TYPE=“ext4”中捕获部分
UUID=“238d1293-918e-42e1-a081-a41f49636d0”
内容并将其存储到变量中?

使用参数替换:

uuid=$(sudo blkid /dev/sdb)
uuid=${uuid#*UUID=\"}  # Remove from left up to UUID="
uuid=${uuid%%\"*}      # Remove from right from the leftmost "
echo "$uuid"

使用参数替换:

uuid=$(sudo blkid /dev/sdb)
uuid=${uuid#*UUID=\"}  # Remove from left up to UUID="
uuid=${uuid%%\"*}      # Remove from right from the leftmost "
echo "$uuid"

Bash的内置regex支持适合于此任务。在下面的函数中,我们根据regex
UUID=“([^”]+)”
测试
blkid
的输出,并在找到匹配项时发出匹配组内容(括号内的所有内容):

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\u for_device/dev/sda
,发出所需的UUID,您可以像往常一样将其捕获到变量中(
sda_UUID=$(UUID\u 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)

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\u for_device/dev/sda
,发出所需的UUID,您可以像往常一样将其捕获到变量中(
sda_UUID=$(UUID\u 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)
使用sed:

YOUR_COMMAND | sed -e 's/.*UUID="\([0-9a-f-]*\)".*/\1/'
例如,您可以使用倒勾来存储它:

a=`YOUR_COMMAND | sed -e 's/.*UUID="\([0-9a-f-]*\)".*/\1/'`

echo $a
使用sed:

YOUR_COMMAND | sed -e 's/.*UUID="\([0-9a-f-]*\)".*/\1/'
例如,您可以使用倒勾来存储它:

a=`YOUR_COMMAND | sed -e 's/.*UUID="\([0-9a-f-]*\)".*/\1/'`

echo $a

顺便说一句,你知道你可以要求
findmnt
直接告诉你UUID,所以你根本不需要解析
blkid
?好主意!我不知道这个命令。但是,sudo findmnt/dev/sdb-o UUID
用两行响应:一行包含“UUID”,另一行包含“238d1293-918e-42e1-a081-a41f4976d0”。所以我仍然需要解析,
-n
标志会抑制该头。如果没有,您可以自己忽略它,方法是将它读入一个变量,然后忽略:
{read header;read-r uuid;}<非常感谢大家!你给了我很多解决办法!顺便说一句,你知道你可以要求
findmnt
直接告诉你UUID,所以你根本不需要解析
blkid
?好主意!我不知道这个命令。但是,sudo findmnt/dev/sdb-o UUID
用两行响应:一行包含“UUID”,另一行包含“238d1293-918e-42e1-a081-a41f4976d0”。所以我仍然需要解析,
-n
标志会抑制该头。如果没有,您可以自己忽略它,方法是将它读入一个变量,然后忽略:
{read header;read-r uuid;}<非常感谢大家!你给了我很多解决办法!此外,这个问题还有一个警告,即如果输出根本没有任何
UUID
字符串,那么在这个答案的第一个修订版中给出的
sed
表达式将不经修改地传递内容。此外,
echo$a
应该是
echo“$a”
;请参阅。(…和re:backticks,请参阅和)通过使用您的解决方案,DumbNewbie,以及Coroba建议的解决方案,我写道:
uuid=$(sudo-blkid/dev/sdb | sed-e's/*uuid=“\([0-9a-f-]*\)*/\1/”
。它起作用了,我很高兴。谢谢@Marc很乐意提供帮助。此外,这一个还有一个警告,如果输出根本没有任何
UUID
字符串,那么在这个答案的第一个修订版中给出的
sed
表达式将不经修改地传递内容。另外,
echo$a
应该是
echo“$a”
;请参阅。(…和re:backticks,请参阅和)通过使用您的解决方案,DumbNewbie,以及Coroba建议的解决方案,我写道:
uuid=$(sudo-blkid/dev/sdb | sed-e's/*uuid=“\([0-9a-f-]*\)*/\1/”
。它起作用了,我很高兴。谢谢@马克很乐意帮忙。