我正在尝试创建一个脚本,该脚本会自动查找插入的设备并对其进行压缩备份。但是,我找不到如何使用expr
的正确方法:
#!/bin/bash
MountText=`mount`
# Show result of regex search
expr "$MountText" : '/dev/(sd[^a])d on [S]+/[sS]+? type'
表达式本身是/dev/(sd[^a])d on [S]+/[sS]+? type
的,并捕获设备名称 (sd*),同时排除与 sda 相关的挂载。
我在 Regexr 上起草了正则表达式(在链接中共享的正则表达式),并使用了mount
转储的内容(要点)。
出于某种原因,它只给出了这个奇怪的错误:
0
我环顾四周,发现了这个问题。它对我没有太大帮助,因为现在它暗示expr
不认识我用来捕获设备的括号,并且它还认为表达式没有捕获任何东西!
我真的很困惑。我做错了什么?
expr
需要注意的几件事:
- 正则表达式隐式锚定在字符串的开头(就像您以
^
开头的表达式一样)。 - 捕获组用转义括号表示,
(...)
。 - 仅支持基本的正则表达式。具体而言,不支持
s
、S
和+?
。
以下内容将匹配一个设备。
expr "$MountText" : '.*/dev/(sd[^a])[[:digit:]] on '
请注意,您不需要将expr
与 bash
一起使用,后者内置了正则表达式匹配。
regex='/dev/(sd[^a])[[:digit:]] on '
mount | while IFS= read -r line; do
[[ $line =~ $regex ]] && echo ${BASH_REMATCH[1]}
done