我正在尝试编写一个脚本,该脚本将一组代表某些的整数作为输入/dev/sda
。例如,如果命令行参数为 3 & 5,则输出将显示/dev/sda3
和 的UUID /dev/sda5
。我的代码是:
#!/bin/bash
### Shows UUID of input /dev's - REQUIRES SUDO
## Options:
## [-m] Multiple Devs - returns both dev name and UUID
## [ ] No option - returns only the UUID of the dev.
while getopts m: option
do
case "${option}"
in
m) echo -e "\nDEV\tUUID\n====\t================"
blkid | grep .*sda[\"$@\"] | sed -r 's/\/dev\/([[:alnum:]]+).* UUID="([[:alnum:]]+)".*/\1\t\2/g'
;;
esac
done
grep .*sda[\"$@\"]
我的主要问题是返回以下错误的行:
$ sudo ./dUShow.sh -m 3 5
DEV UUID
==== ================
grep: Unmatched [ or [^
现在,如果我没有弄错的话,这意味着当我尝试提供替代选项时*.sda[$@]
,我希望 RegEx 用 覆盖*.sda[$1$2]
(相当于*.sda[35]
给定的输入),就会出现问题。
我该怎么做呢?
示例输入
sudo ./dUShow.sh -m 3 5
所需输出
DEV UUID
==== ================
sda3 BC4208CF42089076
sda5 968E185A8E183569
附录
该表达式.*sda[\"$@\"]
会产生*.sda[35]
or吗*.sda[3 5]
?如果是后者,会不会出现问题呢?如果是这样,我该如何解决?
答案1
答案2
对于单位数字匹配,您可以将参数字符串直接放入 RE 括号中。 (我认为这就是您最初想要做的。)
grep "/dev/sda[$*]:"
请注意,$*
将在数字参数之间包含一个空格字符(例如,2
将5
导致$*
具有带引号的值2 5
),但由于我们可以保证/dev/sda :
永远不会匹配,因此在这种情况下并不重要。
为了简化命令行,您可以完全省去grep
,如下所示:
blkid | sed -rn "s#/dev/(sda[$*]):"'.* UUID="([[:alnum:]]+)".*#\1\t\2#p'