2017-01-02 42 views
1

我想匹配遵循这个模式的字符串:故障与案例命令在bash

应该有一个AKNW则可以随后在一个数字或字母开头范围为a-zA-Z,如果它有一个字母作为第二个字母,则数字紧跟它,然后它可以有1,2或3个字母。

我尝试这样做:

#!/bin/bash 
function callsign() { 
    echo -e "Insert your call sign" 
    while true; do 
    read input 
    case $input in 
     [Aa,Kk,Nn,Ww][0-9][a-zA-Z][a-zA-Z]) break;; 
     [Aa,Kk,Nn,Ww][a-zA-Z][0-9][a-zA-Z]) break;; 
     [Aa,Kk,Nn,Ww][a-zA-Z][0-9][a-zA-Z][a-zA-Z]) break;; 
     [Aa,Kk,Nn,Ww][0-9][a-zA-Z][a-zA-Z][a-zA-Z]) break;; 
     [Aa,Kk,Nn,Ww][0-9][a-zA-Z][a-zA-Z][a-zA-Z][a-zA-Z]) break ;; 
     *) echo "please insert valid call sign.";; 
    esac 
    done 
    clear 
} 
callsign 

我有问题,因为我有太多的情况下,(可是并没有包括所有这些)。我怎样才能以更好的方式解决这个问题?

+0

修正了您的编辑错误('#!/ bin/bash')作为编辑的一部分 – Inian

+1

您的glob [[Aa,Kk,Nn,WW]'看起来很可疑(虽然没有语法错误,但可能会显示一些误解)...你想要完全匹配什么? –

+6

我很好奇关于表面上任意使用大写的问题。 –

回答

1

所以我应该开始的任何AKNW然后可以后跟一个数字或字母AZ,如果它有一个字母的数量紧随其后的第二个字母,然后它可以有1-3个字母

有几种可能性来做比赛。其中之一是使用正则表达式:

#!/bin/bash 

shopt -s nocasematch 

callsign() { 
    while true; do 
     read -ep "Insert your call sign: " input 
     if [[ $input =~ [aknw](|[a-z])[0-9][a-z](|[a-z](|[a-z])) ]]; then 
     break 
     else 
     echo "please insert valid call sign." 
     fi 
    done 
    echo "it works!" 
} 
callsign 

另一种可能性是使用扩展的水珠:

#!/bin/bash 

shopt -s nocasematch extglob 

callsign() { 
    while true; do 
     read -ep "Insert your call sign: " input 
     if [[ $input = [aknw]@(|[a-z])[0-9][a-z]@(|[a-z]@(|[a-z])) ]]; then 
     break 
     else 
     echo "please insert valid call sign." 
     fi 
    done 
    echo "it works!" 
} 
callsign 

注意使用nocasematch,使之与低/大写交易。

+0

'++'使用re的冗余glob语法。 – Inian