web-dev-qa-db-ja.com

Bashは常に正規表現をtrueとして評価します

スクリプトには、これらの行があります

#!/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*"

そして、2番目のアスタリスクが新しい行に配置されていることがわかりました。 $SCREEN_NAMEが設定されます:

SCREEN_NAME=$(grep -i 'server_screen_title' server.properties  | cut -f2 -d'=')

値はINI like configファイルから読み込まれます。興味深い行は

server_screen_title=Test-Server

そして、値には終了文字\n。したがって、テストは失敗します。私はcutのmanを読んだことがありますが、これを修正する方法がわかりません。

5
Yanick Rochon

私はこれについて速すぎました、あなたのテストは動作します。何らかの形で、$SCREEN_NAMEをグローバルに、または以前にスクリプトで不正な文字を含む文字列として設定したと思われます。

^[a-zA-Z0-9_.-]+$は、許可された文字のみを含むNULL以外の文字列と一致します。したがって、$SCREEN_NAMEが許可された文字のみを含むNULL以外の文字列である場合、$SCREEN_NAME =~ ^[a-zA-Z0-9_.-]+$の値は0です。

!は値を反転するため、$SCREEN_NAMEが許可された文字のみを含むNULL以外の文字列である場合、! [[ $SCREEN_NAME =~ ^[a-zA-Z0-9_.-]+$ ]]の値は1です。

したがって、条件は大丈夫です。

bashとスクリプトの両方でecho $SCREEN_NAMEを実行し、実際の出力が予想と一致するかどうかを確認します。

編集:末尾のキャリッジリターンを削除するための1つの解決策は、grepの出力をtrの前にcutにパイプすることです。

SCREEN_NAME=$(grep -i 'server_screen_title' server.properties | tr -d '\r' | cut -f2 -d'=')
3
kos