2016-06-23 7 views
1

Я что-то писал в BASH, и я нашел странную ошибку. Я развиваюсь на Mac (El Capitan), и все работает безупречно. Но развертывание на сервере Ubuntu 16.06 терпит неудачу, и я понятия не имею, почему.BASH regex check not matching on linux

Мой код следует

while ! [[ ${someVariable} =~ ^[a-zA-z0-9_-]{40}$ ]] 
do 
    read someVariable 
    if ! [[ ${someVariable} =~ ^[a-zA-z0-9_-]{40}$ ]];then 
     echo 'try again' 
    fi 
done 

для ввода 6LfMYB8TAAAAACRZ9bP-0GN9y4zKUYPtj255-Е8а это терпит неудачу. И сбой происходит только на сервере, а не на машине разработки. У меня такое чувство, что я пропустил что-то очевидное.

+0

Что говорит @James. Но также, возможны разные версии bash ('bash --version')? –

+1

В удаленном ответе упоминается подозрительный диапазон 'A-z'. Убедитесь, что ваш скрипт продолжает сбой, если вы замените его на «A-Z». – chepner

+0

Диапазон был плохим, это была простая опечатка. К счастью для меня было то, что я скопировал все, если. Если бы я набрал его снова здесь, я бы не ошибся – Rouz

ответ

2

В ваших диапазонах есть опечатка. Диапазон верхний корпус должен быть от A-Z Этот код работает на Ubuntu 14.04

while ! [[ ${someVariable} =~ ^[a-zA-Z0-9_-]{40}$ ]] 
do 
    read someVariable 
    if ! [[ ${someVariable} =~ ^[a-zA-Z0-9_-]{40}$ ]];then 
     echo 'try again' 
    fi 
done 
+1

Это. Причина, по которой OP видит разные результаты для 'A-z', обусловлена ​​локалью. Он случайно работал бы для 'LC_COLLATE = C' (по умолчанию) и' POSIX', но не удался для систем, например, 'En_US.utf8'. –

+0

да! проблема была вызвана простой опечаткой ... Иногда я чувствую себя глупо. Спасибо! – Rouz

1

попробуйте это регулярное выражение?

^[-_a-zA-Z0-9]{40}$ 
+0

Хотя моя проблема была связана с простой опечаткой, которую я не видел (диапазон был Az вместо AZ) Я хотел бы знать, почему это регулярное выражение будет лучше, и Конечно, почему бы вам предложить это решение. Является ли это более эффективным или ...? – Rouz

+0

О, я просто набрал то, что, как я думал, будет работать в терминале. Я решил, что вы сделаете разницу и выясните, что пошло не так. – James