Команда 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
Другие вопросы по тегам