入力例

入力例

私は何かを表す整数セットを入力として使用するスクリプトを書こうとしています/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]または*.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. 拡張正規表現

おすすめ記事