8

bash4.1の正規表現を使用してパターンを正しく一致させることができません。引用符と引用符ではない違いについていくつかの情報を読みましたが、それが私の問題ではないと思います。

私の目標は、スクリプトに有効なIDが提供されていることを確認することです。この場合の有効なIDは、9桁の文字列です。そのための正規表現は\d{9}であると私は理解しています。確認するコードスニペットは次のとおりです。

id=$1       
if [[ $id =~ \d{9} ]]; then
     echo "This is a vaild ID"
else
     echo "This is not a vaild ID"
fi

次に、次のコマンドでスクリプトを呼び出します。

 ./script 987654321

私が行方不明になっていることは明らかですか?

4

4 に答える 4

9

これは機能します: if [[ $id =~ [[:digit:]]{9} ]] – David W. 11時間前


@David bashで試してみましたが、うまくいかなかったようです。– Vivin Paliath 10時間前


テストプログラムを書きました:

#! /bin/bash

for id in 123456789 12345689 1234567890 987654321
do
    if [[ $id =~ ^[[:digit:]]{9}$ ]]
    then
        echo "$id is 9 digits long"
    else
        echo "$id is bad"
    fi
done

そして、次の出力を得ました。

DaveBook:~ david$ ./test.sh
123456789 is 9 digits long
12345689 is bad
1234567890 is bad
987654321 is 9 digits long
DaveBook:~ david$ 

Mac OS X には BASH 3.2.48 を使用し、Cygwin には Bash 4.1.10(4) を使用しています (うわー、Mac バージョンはそんなに古いのですか?)。Linuxボックスでこれをテストしていません。

どのバージョンを使用していますか? 角括弧を二重にしています:digit:か?である必要が[[:digit:]]あり[:digit:]ます。

また、 orに一致させたくないので、そこに^andアンカーが必要であることにも気付きました。これはあなたが抱えていた問題でしたか?$foo123456789bar1234567890123456790

[[:digit:]] 問題は、それが機能するはずだったということです。私はそれがかなり普遍的であると考えて、多くの Bash シェル スクリプトでそれを使用しました。ただし、BASH シェルが機能しない場合は、使用を中止する必要があります。

于 2011-09-16T13:49:54.040 に答える
9

他の人がすでに回答したように、サポートされていない[0-9]{9}ため、使用する必要があります。\dしかし、もう 1 つの重要な点は、アンカーを使用する必要があることです。

^[0-9]{9}$

^は正規表現を文字列の先頭に固定し、$はそれを末尾に固定します。これらを使用しない場合、正規表現は、「abc123456789」、「asdf123456789zui」、「123456789FOOBAR」など、9 桁のシーケンスを含むすべての文字列に一致します。

于 2011-09-16T05:49:17.613 に答える
3

これを試して:

if [[ $id =~ [0-9]{9} ]]; then

bash が として認識しない\dよう[0-9]です。

Bash は拡張正規表現方言を使用しますが、これは をサポートしていません\d

ERE の文法 (語彙規則) によると、エスケープ文字は の形式\SPEC_CHARです。SPEC_CHAR次のいずれかになります。

^    .    [    $    (    )    |
*    +    ?    {    \
于 2011-09-15T23:32:42.610 に答える
-2

問題は、\d が解釈される前に d に変換されることです。ダブルエスケープを試してください。

\d{9} => d{9}
\\d{9} => \d{9}

または、引用符で囲むこともできます

if [[ $id =~ "\d{9}" ]]
于 2011-09-15T23:56:12.260 に答える