인수에서 일부 값을 가져오기 위해 'grep' 명령을 어떻게 사용할 수 있습니까?

인수에서 일부 값을 가져오기 위해 'grep' 명령을 어떻게 사용할 수 있습니까?

실제로 저는 다음과 같은 과제를 수행하고 있습니다.

1: 인수가 유효한 쉘 변수 이름이면 "yes"를 인쇄하고 그렇지 않으면 "no"를 인쇄하는 valid라는 프로그램을 작성하세요.

내가 하고 있는 일은 'grep' 명령을 사용하여 [0-9]*와 같은 정규식을 포함하는 값을 찾고자 하는 것입니다. 하지만 'grep' 명령은 기본적으로 파일의 일부 라인을 캡처하기 때문에 입력한 인수에서 해당 표현식을 포함하여 일부 값을 가져오는 방법을 모릅니다. 어떤 도움이라도 정말 감사하겠습니다

답변1

이것은 grep을 사용하지 않지만 참조 포인트로 bash의 =~조건부 연산자를 사용하여 스크립트의 첫 번째 인수를 a에 대한 정규식 클래스와 비교할 수 있습니다 name.배쉬 참조 매뉴얼처럼:

문자, 숫자, 밑줄로만 구성되고 문자나 밑줄로 시작하는 단어입니다. 이름은 쉘 변수 및 함수 이름으로 사용됩니다.

$ cat isvarname
#!/bin/bash
if [ "$#" -ne 1 ]
then
   echo "Usage: $0 a-string"
   exit 1
fi

if [[ "$1" =~ ^[[:alpha:]_][[:alnum:]_]*$ ]]
then
  echo yes
else
  echo no
fi

답변2

유효한 bash변수 이름은 하나 이상의 단일 바이트 문자로 구성되며 첫 번째 문자는 알파벳 또는 밑줄이고 나머지 문자는 알파벳(있는 경우 0123456789 또는 밑줄)입니다.

예를 들어 0xC3 0xA9로 인코딩된 UTF-8이 아닌 0xE9 바이트인 ISO-8859-1과 같이 단일 바이트인 Stéphane로케일에서만 유효한 변수 이름입니다 .é

다음과 같이 할 수 있습니다:

#! /usr/bin/env bash
is_single_byte() {
  local length_in_bytes length_in_chars
  length_in_chars=${#1}
  local LC_ALL=C
  length_in_bytes=${#1}
  ((length_in_bytes == length_in_chars))
}

re='^[[:alpha:]_][[:alnum:]_]*$'
for var do
  if is_single_byte "$var" && [[ $var =~ $re ]]; then
    printf '"%s" is a valid variable name\n' "$var"
  else
    printf '"%s" is not a valid variable name\n' "$var"
  fi
done

답변3

첫 번째 명령줄 인수는 으로 사용할 수 있습니다 $1. 유효한 쉘 변수 이름은 알파벳 문자(또는 밑줄)로 시작하고 영숫자(또는 밑줄)로 계속됩니다.

일치하는 두 개의 쉘 패턴유효하지 않은쉘 변수 이름은

[!a-zA-Z_]*

그리고

[a-zA-Z_]*[!a-zA-Z_0-9]*

case ... esac변수 값에 대해 패턴 일치를 수행하는 데 사용할 수 있습니다 .

스포일러 경고:

#!/bin/sh
LC_ALL=C
케이스 "$1" in
    [!a-zA-Z_]*|[a-zA-Z_]*[!a-zA-Z_0-9]*|"")
        에코 '아니요'
        ;;
    *)
        에코 '예'
에삭
이름이 비어 있는 변수에 대해서도 "NO"라고 대답합니다. 이는 정규 표현식이 아닌 쉘 글로빙 패턴을 사용하고 있으며 bash.

테스트:

$ ./script.sh _ae
YES
$ ./script.sh 0a9oe
NO
$ ./script.sh aoeat
YES
$ ./script.sh aoeat-aoe
NO

답변4

#!/bin/bash
var=$1
if [[ $var =~ [\`\$\=\/] || $var =~ \[ ]]; then
    echo 'no'
    exit
fi
declare "$var"=test 2>/dev/null
if [[ ${!var} == 'test' || $1 == 'var' ]]; then
    echo 'yes'
else
    echo 'no'
fi

test그러면 제공된 값에 값을 할당하려고 시도합니다 . 성공하면(값이 유효한 변수 이름인 경우) if테스트와 일치하고 yes를 에코하고, 그렇지 않으면 no를 에코합니다.

관련 정보