"grep" 명령을 사용하여 매개변수에서 일부 값을 얻는 방법은 무엇입니까?

"grep" 명령을 사용하여 매개변수에서 일부 값을 얻는 방법은 무엇입니까?

사실 저는 다음과 같은 숙제를 하고 있어요.

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

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

답변1

이것은 grep을 사용하지 않지만 참조를 위해 bash의 =~조건부 연산자를 사용하여 스크립트의 첫 번째 인수를 정규식 class 와 비교할 수 있습니다 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 또는 밑줄입니다.

예를 들어, Stéphane변수 이름은 로케일 내에서만 유효합니다. éISO-8859-1에서는 단일 바이트이고 0xE9 바이트이지만 UTF-8에서는 0xC3 0xA9로 인코딩됩니다.

다음을 수행할 수 있습니다.

#! /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'
    [!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를 에코합니다.

관련 정보