環境変数を作成しました。
WD=`pwd`
スペースや英語以外の文字が含まれているかどうかを確認するには?
答え1
「非英語文字」とは、通常のラテン文字26文字ではない文字を意味すると思います。厳密に言えば、あなたの要件を満たすテストは次のとおりです。
if tmp=${WD//[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]/};
[[ $tmp = *[[:alpha:] ]* ]]; then
# $WD contains letters other than A-Z and a-z or a space
つまり、英字を削除し、まだ文字またはスペースがあることを確認します。
¿
実際には、またはまたは£
など、非ASCII文字を含むASCII以外のすべての文字とすべてのスペースを避けたいと思います٣
。!
パスできない文字~
(スペースを除くASCII文字)を一致させることでこれを行うことができます。
if (LC_ALL=C; [[ $WD = *[^!-~]* ]]) then …
気づく範囲は、ユーザーが設定した期待値に応じて、常にパフォーマンスが良くて!-~
もそうではありません。A-Z
LC_COLLATE
だから私たちはそれをLC_ALL
既知の値(LC_ALL
すべての値より優先)に設定しました。ロケール設定)。
ファイルで「異常な」文字をチェックする場合(ほとんどの最新プラットフォームで許可されているスペースを除外したい理由)、移植できない文字を許可しないより制限的なリストを持つことが合理的かもしれません。 。POSIXASCII文字、数字、および-._
。
if (LC_ALL=C; [[ $WD = *[^-._0-9A-Za-z]* ]]) then …
答え2
正規表現はgrep
あなたが探しているものです。
英語以外の文字や数字を一致させます/
(すべてのパスの一部であるため)。
if [[ -n "$( pwd | grep -o -P "([^a-zA-Z0-9\/])*" )" ]]; then
echo "error"
fi
sed
この場合も使用できます。
正しい記号をすべてに置き換えて、残りのものがあることを確認してください${WD}
。''
結果の文字列の長さがゼロでない場合、${WD}
これは無効です。
/
したがって、数字と文字だけが予想される場合です。
if [[ -n "$( pwd | sed -r -e 's/([a-zA-Z0-9\/])*//g' )" ]]; then
echo "error"
fi
答え3
tr
この場合、grep
orより少し簡単です。sed
if [[ -n "$(echo $WD|tr -d '[:alnum:]/')" ]];then
echo "gotcha"
fi
答え4
Bashは独自のパターンマッチングを実行できます。
if [[ ${WD} = *[^[:alnum:]/]* ]]; then
echo 'Baaaad.'
fi