나는 무언가를 나타내는 정수 세트를 입력으로 사용하는 스크립트를 작성하려고 합니다 /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
한 자리 일치의 경우 인수 문자열을 RE 대괄호에 직접 넣을 수 있습니다. (원래 하고 싶었던 일이 바로 이 일인 것 같아요.)
grep "/dev/sda[$*]:"
$*
숫자 인수 사이에는 공백 문자가 있지만( 예 를 들어 따옴표로 묶인 값이 발생함 2
) 일치하는 항목이 전혀 없을 것이라고 보장할 수 있으므로 이 경우에는 중요하지 않습니다.5
$*
2 5
/dev/sda :
명령줄을 단순화하려면 다음과 같이 완전히 생략할 수 있습니다 grep
.
blkid | sed -rn "s#/dev/(sda[$*]):"'.* UUID="([[:alnum:]]+)".*#\1\t\2#p'