Команда Bash для проверки правильности имени переменной
#check if the name is valid
function myfunc()
{
#check "${1}"
#echo "valid/invalid"
}
#these should return valid
myfunc "my_number"
myfunc "my_number1"
#these should return ivalid
myfunc "1my_number"
myfunc "1my _number"
myfunc "my number"
myfunc "my_number?"
и так по имени переменной могут быть только буквы, цифры (но не в начале),.. и как все правила для java...
Есть ли какая-нибудь функция, которую я могу использовать? Я не хочу изобретать велосипед...
4 ответа
Сопоставьте имя переменной с регулярным выражением, например так:
myfunc() {
if [[ "$1" =~ ^[a-z][a-zA-Z0-9_]*$ ]]
then
echo "$1: valid"
else
echo "$1: invalid"
fi
}
Ответ Dogbane почти полный для контекста переменных Bash, но он не был обновлен, чтобы отразить окончательный комментарий, который содержит полностью работающий валидатор. Согласно его комментарию к его ответу, это предназначено. Этот ответ предоставляет функцию, которая оценивается как true для всех допустимых имен и может использоваться в качестве условия, а не возвращать значение, которое затем необходимо сравнить с чем-либо. Кроме того, он может быть использован для нескольких оболочек.
Функция:
isValidVarName() {
echo "$1" | grep -q '^[_[:alpha:]][_[:alpha:][:digit:]]*$' && return || return 1
}
Пример использования в bash:
key=...
value=...
if isValidVarName "$key"; then
eval "$key=\"$value\""
fi
# or it might simply look like this
isValidVarName "$key" && eval "$key=\"$value\""
Только Баш:
isvalidvarname ()
{
local varname;
local regexp_varname='^[_[:alpha:]][_[:alpha:][:digit:]]*$';
varname="$1";
[[ "${varname}" =~ ${regexp_varname} ]]
}
Комбинация уже предложенных ответов. Для всех оболочек с помощью grep:
is_valid_name() { # NAME
printf '%s' "$1" | grep --quiet '^[_[:alpha:]][_[:alpha:][:digit:]]*$'
}
Для оболочек, которые принимают регулярное выражение, например Bash:
function is_valid_name { # NAME
[[ "$1" =~ ^[_[:alpha:]][_[:alpha:][:digit:]]*$ ]]
}
Оба возвращают 0 (истина), если NAME является допустимым именем переменной, в противном случае возвращают 1 (ложь). Их можно использовать следующим образом:
NAME='...'
is_valid_name "$NAME" && ...
if is_valid_name "$NAME"; then
...
fi