Re: Pregunta tonta de Bash [SOLUCIONADO]
Iñaki wrote:
> PD: Mi problema es que me estoy mal acostumbrando con la maravillosa
> programación en Ruby, y hacer un "if" en Bash me empieza a resultar un
> infierno ;)
Je. Ruby es la berraquera, en efecto... ¿qué les costaba ponerle un
"unless" a Bash? :)
Pero Bash no es tan malo... y de hecho es bastante consistente. Creo
que parte del problema es que estás ignorando un detalle importante:
esos corchetes '[', ']' que pones alrededor de la "condición", realmente
no son parte de la sintaxis de if.
El '[' es de hecho un comando. Es un sinónimo para el comando "test";
ve su manual: test(1). El ']' final es ignorado; se te deja usarlo para
que la condición no se vea fea.
Cuando escribes
if [ false ] ; then echo "verdadero"; fi
le estás pidiendo a 'if' que evalúe el comando 'test false', y ejecute
las instrucciones tras el 'then' si 'test false' devuelve cero.
Y la consola responde con "verdadero". Eso es porque la evaluación de
test false
es verdadera (e.g. devuelve 0), lo mismo que test true, test x, test 0,
etc.:
if [ true ] ; then echo "cierto"; fi
--> cierto
if [ false ] ; then echo "cierto"; fi
--> cierto
test no intenta ejecutar sus parámetros; asume que son cadenas. Llamar
a test con un parámetro produce verdadero siempre que el parámetro no
sea la cadena vacía (ve test(1))
'if' ejecuta lo que pongas en el then si la "lista" que le das a
ejecutar como condición devuelve 0 (ve en el manual bash(1) la
definición de una "lista": es muy esclarecedora).
Lo que pides, pues, se puede poner como
if ! which top >/dev/null ; then
echo "no hay top!"
exit 1
fi
Nota la ausencia de '['. Nota también el espacio entre el '!' y
'which', que es importante.
O claro, se puede hacer también de todas las maneras que la gente ha
sugerido :-)
--
César Rincón
Enlaces Tecnológicos
Guadalajara, México
Reply to: