Как использовать команду «grep», чтобы извлечь какое-либо значение из аргументов?

Как использовать команду «grep», чтобы извлечь какое-либо значение из аргументов?

На самом деле, я выполняю следующее задание:

1: Напишите программу с именем valid, которая выводит «yes», если ее аргумент является допустимым именем переменной оболочки, и «no» в противном случае:

Я хочу найти некоторое значение, которое включает регулярное выражение, например [0-9]*, используя команду 'grep'. Но я понятия не имею, как извлечь некоторое значение, включающее это выражение, из аргумента, который я ввожу, поскольку команда 'grep' в основном захватывает некоторую строку в файле. Любая помощь будет очень признательна

решение1

Здесь не используется grep, но в качестве точки отсчета можно использовать =~условный оператор bash для сравнения первого аргумента скрипта с классом регулярного выражения для a name, который определяется какСправочное руководство по Bashкак:

Слово, состоящее исключительно из букв, цифр и подчеркиваний и начинающееся с буквы или подчеркивания. Имена используются в качестве имен переменных оболочки и функций.

$ 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/ш
LC_ALL=С
случай "$1" в
    [!a-zA-Z_]*|[a-zA-Z_]*[!a-zA-Z_0-9]*|"")
        эхо «НЕТ»
        ;;
    *)
        эхо «ДА»
есак
Это также отвечает "НЕТ" для переменной, имя которой пусто. Обратите внимание, что это использует шаблоны подстановки оболочки, а не регулярные выражения, и что это работает в любой оболочке POSIX, а не только 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и выведет «да», в противном случае выведет «нет».

Связанный контент