変数が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
! pipeline
cmd2
pipeline
[[ ... ]]
=~
bash
POSIXモードでもまだ有効と見なされます。
POSIX sh では、動作は[[
一部用に予約されているため指定されません。指定されていないアクション。[[
特別なキーワードを持たないPOSIX sh実装では、構文的にはまだ有効です(引用符のない部分を除いて、次のように$
入力できます)。指定されていない[[
地域)が、コマンドが見つからないというエラーが発生する可能性があります。
unexpected token !
あなたが入るという事実は、if ! [[ "$hn" =~ ^[[:digit:]]+$ ]]; then
コマンドが不要なコンテキストでコードが見つかったことを示します。たとえば、これはドアの途中でcase
orパターンが代わりに表示されるためです(このパターンはパターンとして受け入れられますが、パーサーがorトークンを期待しているため、次のトークンは予期しません)。esac
if
case
!
|
)
今、否定的な正規表現の一致に戻ります。はい、すべてのコマンドを無効にする! [[ "$var" =~ $regexp ]]
ことができます(実際には!
管路)その内容を含みます。!
条件式演算子を使用することもできます[[ ! "$var" =~ $regexp ]]
。
しかし、このコマンドは 's(おそらくawk'sからインスピレーションを受けたようです)からインスピレーションを=~
受けたように見えますが、 's(または 's)演算子はサポートされていません。perl
=~
~
perl
awk
!~
特定の正規表現に関しては詳細な説明は他の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進数として解釈されるか(たとえば、一部の数字でエラーが発生した場合)、先行ゼロ(ゼロ自体を除く)を持つ数字を拒否したり、内容がサポートするよりも大きい数字を拒否したりすることがあります。使用されます。