El Miércoles, 8 de Noviembre de 2006 23:59, César Rincón escribió: > 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 :-)
Impresionante explicación. Esta va directa a mi disco duro ;) Pues no, no tenía ni idea del significado de [ en bash, pensaba que era parte de la sintaxis (obligatoriamente). Mil gracias de nuevo por la perfecta explicación. Saludos. -- Iñaki Por el bien de todos respetemos las normas de la lista: http://wiki.debian.org/NormasLista

