示例输入

示例输入

我正在尝试编写一个脚本,该脚本将一组代表某些的整数作为输入/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

如果 $1==3 且 $2==5 那么

grep .*sda[\"$@\"]

变成

grep .*sda[3 5]

由于缺少引号,这是一个问题。试试这个:

regex=".*sda($( IFS='|'; echo "$*" ))\\>"     # => .*sda(3|5)\>
blkid | grep -E "$regex" | ...

\>是一个单词边界,使正则表达式更加精确。


有关 GNU grep 正则表达式风格的一些文档:

  1. 基本正则表达式
  2. 扩展正则表达式

答案2

对于单位数字匹配,您可以将参数字符串直接放入 RE 括号中。 (我认为这就是您最初想要做的。)

grep "/dev/sda[$*]:"

请注意,$*将在数字参数之间包含一个空格字符(例如,25导致$*具有带引号的值2 5),但由于我们可以保证/dev/sda :永远不会匹配,因此在这种情况下并不重要。

为了简化命令行,您可以完全省去grep,如下所示:

blkid | sed -rn "s#/dev/(sda[$*]):"'.* UUID="([[:alnum:]]+)".*#\1\t\2#p'

相关内容