
На самом деле, я выполняю следующее задание:
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
и выведет «да», в противном случае выведет «нет».