В сценарии существуют эти строки
#!/bin/bash
...
if ! [[ $SCREEN_NAME =~ ^[a-zA-Z0-9_.-]+$ ]]; then
echo "The Server title contains invalid symbole. Only a-z A-Z 0-9 - _ . are allowed"
exit 1;
fi
Проблема - это, безотносительно значения $SCREEN_NAME
установлен на, сценарий всегда выходят с тем сообщением. Я попытался читать регулярные выражения с Bash, и я ничего не вижу неправильно с ним. Что я пропускаю?
Следующие комментарии и ответы, я отозвался эхом $SCREEN_NAME
, и ничто не казалось неправильным..., пока я не сделал
echo "*$SCREEN_NAME*"
и видел, что вторая звездочка была помещена на новую строку. Вот то, как $SCREEN_NAME
установлен:
SCREEN_NAME=$(grep -i 'server_screen_title' server.properties | cut -f2 -d'=')
Значение читается из INI как файл конфигурации. Интересная строка
server_screen_title=Test-Server
И я полагаю, что значение содержит оконечный знак \n
. Таким образом тестовые сбои. Я считал человека для cut
, но я не уверен, как зафиксировать это, ни если я прав на этом.
Я был слишком быстр на этом, Ваших тестовых работах. Я подозреваю, что Вы так или иначе установили $SCREEN_NAME
или глобально или ранее в сценарии как строка, содержащая запрещенный символ.
^[a-zA-Z0-9_.-]+$
соответствует непустой строке, содержащей только допустимые символы, итак, если $SCREEN_NAME
непустая строка, содержащая только допустимые символы, $SCREEN_NAME =~ ^[a-zA-Z0-9_.-]+$
значение 0.
!
инвертирует его значение, итак, если $SCREEN_NAME
непустая строка, содержащая только допустимые символы, ! [[ $SCREEN_NAME =~ ^[a-zA-Z0-9_.-]+$ ]]
значение равняется 1.
Таким образом, условие в порядке.
Выполненный echo $SCREEN_NAME
в обоих bash
и Ваш сценарий и проверяет, соответствует ли эффективная выходная мощность тому, что ожидается.
Править: Для удаления запаздывающего возврата каретки одно решение состоит в том, чтобы передать по каналу grep
вывод к tr
прежде cut
:
SCREEN_NAME=$(grep -i 'server_screen_title' server.properties | tr -d '\r' | cut -f2 -d'=')