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 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
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
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
).
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.
Tags bash shell-scripting