スクリプトには、これらの行があります
#!/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を読んだことがありますが、これを修正する方法がわかりません。
私はこれについて速すぎました、あなたのテストは動作します。何らかの形で、$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'=')