PWDにスペースや英語以外の文字が含まれているかどうかはどうすればわかりますか?

PWDにスペースや英語以外の文字が含まれているかどうかはどうすればわかりますか?

環境変数を作成しました。

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-ZLC_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この場合、greporより少し簡単です。sed

if [[ -n "$(echo $WD|tr -d '[:alnum:]/')" ]];then
  echo "gotcha"
fi

答え4

Bashは独自のパターンマッチングを実行できます。

if [[ ${WD} = *[^[:alnum:]/]* ]]; then
  echo 'Baaaad.'
fi

関連情報