입력 예

입력 예

나는 무언가를 나타내는 정수 세트를 입력으로 사용하는 스크립트를 작성하려고 합니다 /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. 확장 정규식

답변2

한 자리 일치의 경우 인수 문자열을 RE 대괄호에 직접 넣을 수 있습니다. (원래 하고 싶었던 일이 바로 이 일인 것 같아요.)

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

$*숫자 인수 사이에는 공백 문자가 있지만( 예 를 들어 따옴표로 묶인 값이 발생함 2) 일치하는 항목이 전혀 없을 것이라고 보장할 수 있으므로 이 경우에는 중요하지 않습니다.5$*2 5/dev/sda :

명령줄을 단순화하려면 다음과 같이 완전히 생략할 수 있습니다 grep.

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

관련 정보