RegExが適用されているコマンドライン引数をgrepする方法は?
特定の/dev/sda
を表す整数のセットを入力として受け取るスクリプトを作成しようとしています。たとえば、コマンドライン引数が3と5の場合、出力には/dev/sda3
と/dev/sda5
のUUIDが表示されます。私のコードは:
#!/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[$@]
に相当する*.sda[$1$2]
でRegExに上書きさせたい*.sda[35]
を代替オプションとして提供しようとしたときに問題が発生することを意味します。
どうすればよいですか?
サンプル入力
Sudo ./dUShow.sh -m 3 5
必要な出力
DEV UUID
==== ================
sda3 BC4208CF42089076
sda5 968E185A8E183569
補遺
式.*sda[\"$@\"]
は*.sda[35]
または*.sda[3 5]
を生成しますか?後者の場合、問題は発生しますか?もしそうなら、どうすればそれを解決できますか?
1桁の一致の場合、引数文字列をREブラケットに直接入れることができます。 (これはあなたが最初にやろうとしていたことだと思います。)
grep "/dev/sda[$*]:"
$*
には、数字の引数の間にスペース文字が含まれます(たとえば、2
と5
の結果、$*
の引用値は2 5
になります)。 /dev/sda :
が決して一致しないことを保証できるので、この状況では問題ではありません。
コマンドラインを簡略化するために、次のようにgrep
を完全に省略できます。
blkid | sed -rn "s#/dev/(sda[$*]):"'.* UUID="([[:alnum:]]+)".*#\1\t\2#p'