2017-03-03 4 views
0

case文で5〜7文字列の文字列を照合しようとしています。私はうまくいきました。 これは私が試したことの一つです。bash case文の数値文字列と一致させるには

^[0-9]*$) 
    echo "Got it!" 
    ;; 

これをどのようにして正常に実行できますか?あなたはまた、長さを確認したい場合は

+0

これは正規表現構文ですが、case文はグロブスタイルのパターン構文をとります。 –

答えて

4
$ shopt -s extglob 
$ isNum() { case $1 in (+([0-9])) echo 'Got it!' ;; esac; } 
$ isNum 123A 
$ isNum A123 
$ isNum 1234 
Got it! 

、それは別々に行われることがあります

isNum() { 
    local len=${#1} 
    if ((len < 5 || len > 7)); then return; fi 
    case $1 in (+([0-9])) echo 'Got it!' ;; esac 
} 

トリックはここに適切な正規表現と同様の機能を可能にする「extglob」(拡張されたグロブ)構文です。 extglob内の+(...)は、 "1以上の..."を意味します。

詳しくは、bash-hackersページPatterns and pattern matchingを参照してください。

ksh93を除いて、globsは特定の回数の繰り返しに一致するほど強力ではありません。実際にはそれを自分で書き出す必要があります。例えば:

# this is very clumsy, but works in all POSIX shells 
isNum() { 
    case $1 in [0-9][0-9][0-9][0-9][0-9])   : "Matched 5" ;; 
      [0-9][0-9][0-9][0-9][0-9][0-9])  : "Matched 6" ;; 
      [0-9][0-9][0-9][0-9][0-9][0-9][0-9]) : "Matched 7" ;; 
      *) return ;; 
    esac 
    echo "Got it!" # only reached if the "return" didn't happen 
} 

はこのように、あなたはおそらく、マーク・リードによって答えで説明したのbash-のみ正規表現の構文を使用して方がいいでしょう - もthe relevant bash-hackers pageを参照してください。

+1

正確に何文字が一致するかを知る必要がない場合は、より短い(ただし扱いにくい) '[0-9] [0-9] [0-9] [0-9] [0 -9]?([0-9]?([0-9])) ' – chepner

3

bash case文のパターンは、ファイルグロブであり、正規表現ではありません。あなたは正確な長さについてはあまりうるさいであれば、あなたは「1桁以上」を一致させるために拡張されたグロブ機能を使用することができ、しかし

if [[ "$string" =~ ^[0-9]{5,7}$ ]]; then 
    echo "Got it!" 
fi 

:あなたの最良の選択肢ではなくcaseの場合/他の鎖であってもよい

shopt -s extglob 
case "$string" in 
    (+([0-9])) echo "Got it!";; 
esac 
0

あなたは本当に、本当に、これはトリックを行うだろう、caseステートメントを使用する場合:

string=12345 
case "${#string}-${string}" in 
    5-[0-9]*) 
    echo "'${string}' contains 5 digits" 
    ;; 
    7-[0-9]*) 
    echo "'${string}' contains 7 digits" 
    ;; 
    *) 
    echo "Something else" 
    ;; 
esac 

アイデアは、文字をカウントし、先頭に追加することです数値に数えます。したがって、case文字列には、テキスト自体に加えて長さに関するメタデータが含まれています。

+1

しかしこれも' 1abcd'と一致します。例えば、拡張されたglobが必要です: '5 - +([0-9])'、例えば。 –

+0

これは、POSIX互換の高価なソリューションを提供するために変更することができます。検査する文字列に ' - $(echo" $ string "| tr -d '[^ 0-9]')'を追加し、各パターンに ' - " $ string "を追加します。これは、文字列自体が非数字文字を削除する行為によって変更されていないことをチェックします。 – chepner

関連する問題