bash + como combinar cadeia de caracteres que inclua caracteres e números

2

por favor conselho - o que há de errado com a minha sintaxe? (não deve imprimir a "interface ruim")

remark - eu trabalho com o bash shell

ETH_NAME=eth0         ( or any other as eth1 or eth2 .... )
echo $ETH_NAME

eth0 



[ $ETH_NAME  != eth[0-9] ] && echo bad interface
    
por yael 14.10.2012 / 15:05

3 respostas

5

Use o comando composto [[ ... ]] que pode fazer correspondência de padrão com !=

$ ETH_NAME=eth0
$ [[ $ETH_NAME != eth[0-9] ]] && echo bad interface
$ ETH_NAME=eth01
$ [[ $ETH_NAME != eth[0-9] ]] && echo bad interface
bad interface
    
por 14.10.2012 / 15:15
2

Ou use a instrução padrão (POSIX sh) case em vez de [[...]] do ksh (também encontrada em bash e zsh).

case $ETH_NAME in
  (eth[0-9]) ;;
  (*) echo >&2 bad interface
esac

Observe que a eth10 é uma interface ruim.

Você poderia fazer

case $ETH_NAME in
  (eth|eth*[!0-9]*) echo >&2 bad interface;;
  (eth*) ;;
  (*) echo >&2 bad interface
esac

(note que os nomes das interfaces de rede, incluindo os ethernet, não estão limitados a ethx ).

    
por 14.10.2012 / 16:43
1

Minha maneira favorita de fazer essa correspondência é case…esac :

case "$ETH_NAME" in
    eth[0-9]) ;;
    *) echo 'bad interface' ;;
esac

desde que é rápido e bastante portátil (não requer o uso de bash ). Não posso dizer que o subconjunto de regexps disponíveis para case seja rico, mas geralmente é suficiente.

    
por 14.10.2012 / 18:47