bash正規表現の無効化[閉じる]

bash正規表現の無効化[閉じる]

変数がhn有効な数値整数でない場合は、エラーを検出するために次のパターン一致条件を使用しています。

! [[ "$hn" =~ ^[[:digit:]]+$ ]] && errcode=13

しかし、私は理解しています

bash: /home/flora/int.sh: line 1184: syntax error near unexpected token ! bash: /home/flora/int.sh: line 1184: if ! [[ "$hn" =~ ^[[:digit:]]+$ ]]; then'

答え1

! [[ "$hn" =~ ^[[:digit:]]+$ ]] && errcode=13

文法的に有効ですbash。これは、(パイプラインの実行と状態の無効化)とスカラー変数の割り当てを含むcmd1 && cmd2コマンドのリストです。条件式を評価するために使用される特別な複合コマンドです。その中に正しく分離されたタグが3つあります。 2 番目は正規表現の一致を拡張するために使用される演算子です。 3番目の文字通りの意味は、使用された正規表現です。正規表現として、項目の先頭と項目の終わりの後にロケール内の数字に分類された1つ以上の文字と一致します。cmd1! pipelinecmd2pipeline[[ ... ]]=~

bashPOSIXモードでもまだ有効と見なされます。

POSIX sh では、動作は[[一部用に予約されているため指定されません。指定されていないアクション。[[特別なキーワードを持たないPOSIX sh実装では、構文的にはまだ有効です(引用符のない部分を除いて、次のように$入力できます)。指定されていない[[地域)が、コマンドが見つからないというエラーが発生する可能性があります。

unexpected token !あなたが入るという事実は、if ! [[ "$hn" =~ ^[[:digit:]]+$ ]]; thenコマンドが不要なコンテキストでコードが見つかったことを示します。たとえば、これはドアの途中でcaseorパターンが代わりに表示されるためです(このパターンはパターンとして受け入れられますが、パーサーがorトークンを期待しているため、次のトークンは予期しません)。esacifcase!|)

今、否定的な正規表現の一致に戻ります。はい、すべてのコマンドを無効にする! [[ "$var" =~ $regexp ]]ことができます(実際には!管路)その内容を含みます。!条件式演算子を使用することもできます[[ ! "$var" =~ $regexp ]]

しかし、このコマンドは 's(おそらくawk'sからインスピレーションを受けたようです)からインスピレーションを=~受けたように見えますが、 's(または 's)演算子はサポートされていません。perl=~~perlawk!~

特定の正規表現に関しては詳細な説明は他のQ&Aで、アラビア語の10進数のみを許可するには、通常、または[0-9]などの入力検証を避ける必要があります。[[:digit:]]0123456789

だから:

[[ ! "$hn" =~ ^[0123456789]+$ ]]

または(正規表現の代わりにglobパターンを使用):

[[ "$hn" != +([0123456789]) ]]

shopt -s extglob(以前のバージョンではksh拡張globを認識する必要がありますbash+(...)

より良くなります。

標準sh構文では:

case "$hn" in
  ('' | *[!0123456789]*) true;;
  (*) false;;
esac

019場合によっては、8進数として解釈されるか(たとえば、一部の数字でエラーが発生した場合)、先行ゼロ(ゼロ自体を除く)を持つ数字を拒否したり、内容がサポートするよりも大きい数字を拒否したりすることがあります。使用されます。

関連情報