2011-05-10 6 views
17

tengo el siguiente código y lo necesito hacer eco de 1 si el nombre de host coincide con v-qai01 o cualquier otro servidor * VQ:Bash: compruebe si el nombre de host es v-q * cómo usar comodines?

if [ `hostname -s` -eq `v-q*` ]; then 
     echo "1" 
fi 

Im que tienen varios errores:

./run.sh: line 3: v-q*: command not found 
./run.sh: line 3: [: v-qai01: unary operator expected 

Cualquier sugerencia ¿Por favor?

¿Qué pasa si tengo el siguiente caso?

hostname=`hostname -s` 

portalesWildcard=v-*ws* 
qaiservers={'v-qai01' 'v-qai02'} 
portales={'t1wsyellar01' } 


if [[ ${hostname} = ${qaiservers} ]]; then 
    echo "yes" 
fi 

Gracias

Respuesta

34

Use corchetes dobles y el operador = aceptará comodines:

#!/bin/bash 

if [[ $(hostname -s) = v-q* ]]; then 
    ... 
fi 

También cuenta con un operador de =~ para los partidos de expresiones regulares cuando se necesita la coincidencia de cadenas más avanzados. Esto sería comprobar que el nombre de host también termina con uno o más dígitos:

#!/bin/bash 

if [[ $(hostname -s) =~ ^v-q.*[0-9]+$ ]]; then 
    ... 
fi 
+0

¿Qué sucede si tengo una matriz de nombres de host y quiero verificar si pertenece al nombre de host del servidor actual? – BoDiE2003

+0

@ BoDiE2003, que merece una pregunta por separado. –

1

Esto eliminará v-q desde el principio de la cadena. Si la condición es verdadera, el nombre de host coincide v-q*

hostname=`hostname -s` 
if ! [ "${hostname#v-q}" = "${hostname}" ]; then 
    echo "1" 
fi 
+0

¿y si tengo una matriz en la lista de hostanmes? – BoDiE2003

5

puede utilizar el case declaración:

case $(hostname -s) in 
    v-q*) echo yes ;; 
    *) echo no ;; 
esac 
+0

[Las guías dicen] (http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_03.html) debe haber 'esac' al final de la declaración de caso, no' hecho'. –

+0

bastante bien. gracias por señalar ese error. –

4

El problema real que el cartel original tenía era que se utilizan acentos abiertos alrededor de la cadena:

if [ `hostname -s` -eq `v-q*` ]; then 

en lugar de comillas de cadena. Los Backticks le dicen al shell que ejecute la cadena dentro de ellos como un comando. En este caso, el shell intentó ejecutar:

v-q* 

que falló.

+1

Más comúnmente conocido como 'backticks' – chepner

+0

Editado para la terminología y la claridad. –

Cuestiones relacionadas