2 votes

bash + comment faire correspondre des chaînes qui incluent des caractères et des chiffres

Veuillez me conseiller - qu'est-ce qui ne va pas dans ma syntaxe ? ( il ne faut pas imprimer la "mauvaise interface" )

remarque - je travaille avec bash Shell

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

eth0 

[ $ETH_NAME  != eth[0-9] ] && echo bad interface

5voto

user9517 Points 113163

Utilisez le [[ ... ]] commande composée qui peut effectuer une comparaison de motifs avec !=

$ ETH_NAME=eth0
$ [[ $ETH_NAME != eth[0-9] ]] && echo bad interface
$ ETH_NAME=eth01
$ [[ $ETH_NAME != eth[0-9] ]] && echo bad interface
bad interface

2voto

sch Points 550

Ou utilisez la méthode standard (POSIX sh) case au lieu de l'instruction [[...]] (également présent dans bash et zsh).

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

Notez qu'il dira que eth10 est une mauvaise interface.

Vous pourriez plutôt faire

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

(notez que les noms des interfaces réseau, y compris les interfaces ethernet, ne sont pas limités à ethx ).

1voto

cyphun Points 53

Ma façon préférée de faire cette correspondance est case…esac :

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

puisque c'est rapide et plutôt portable (ne nécessite pas l'utilisation de bash ). Je ne peux pas dire que le sous-ensemble de regexps disponibles pour le programme case est riche, mais souvent elle est suffisante.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X