Bash всегда оценивает Regex как верный

В сценарии существуют эти строки

#!/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, но я не уверен, как зафиксировать это, ни если я прав на этом.

5
задан 26 April 2015 в 11:17

1 ответ

Я был слишком быстр на этом, Ваших тестовых работах. Я подозреваю, что Вы так или иначе установили $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'=')
3
ответ дан 23 November 2019 в 10:27

Другие вопросы по тегам:

Похожие вопросы: