[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: