私は何かを表す整数セットを入力として使用するスクリプトを書こうとしています/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
答え2
1 桁の一致の場合、引数文字列を RE かっこに直接入れることができます。 (元々やりたかったことがまさにこのことだと思います。)
grep "/dev/sda[$*]:"
$*
数値引数の間には空白文字があります(たとえば、引用符で囲まれた値が発生するなど2
)、一致するものがまったくないことを保証できるため、この場合は重要ではありません。5
$*
2 5
/dev/sda :
コマンドラインを単純化するには、次のように完全に省略できますgrep
。
blkid | sed -rn "s#/dev/(sda[$*]):"'.* UUID="([[:alnum:]]+)".*#\1\t\2#p'