Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

485
Views
bash cadena/comando vacío

Encontré algo extraño en bash y no puedo entender cómo funciona.

 [test ~]$ a="" [test ~]$ $a && echo 1 1 [test ~]$ $a [test ~]$ echo $? 0

¿Por qué $a (que está vacío) devuelve 0? ¿Se transforma de alguna manera en un comando vacío? Si agrego comillas o escribo una cadena vacía antes de && , devolverá un error. Mientras que el comando vacío devuelve 0.

 [test ~]$ "$a" && echo 1 -bash: : command not found [test ~]$ "" && echo 1 -bash: : command not found [test ~]$ `` && echo 1 1

Entonces, ¿qué sucede cuando escribo $a?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Parece que confundes bash con algún otro lenguaje de programación. Las variables se reemplazan, luego se ejecuta lo que queda.

 "$a"

Este es el contenido de a , entre comillas. a está vacío, por lo que esto es equivalente a:

 ""

Eso no es un comando. "Comando no encontrado." Como hubo un error, la ejecución no tuvo éxito (el código de retorno del shell no es 0), por lo que la segunda mitad del comando, && echo 1 , no se ejecuta.

comillas...

 ``

... ejecutar lo que sea que haya entre ellos, con la salida de ese comando reemplazando toda la construcción. (También hay $() que hace lo mismo y es menos probable que se pase por alto en un script). Entonces...

 `echo "foo"`

...evaluaría a...

 foo

...que luego sería ejecutado. Entonces tus...

 ``

...evalúa a...

 <empty>

... que luego se "ejecuta con éxito" (ya que no hay error).

Si desea probar el contenido de a y ejecutar echo 1 solo si a no está vacío, debe usar el comando de test :

 test -n "$a" && echo 1

Hay un alias conveniente para test , que es [ , que también ignora convenientemente un final ] ...

 [ -n "$a" ] && echo 1

...y un bash-ismo [[ que "sabe" sobre el reemplazo de variables y, por lo tanto, no necesita comillas para evitar quejarse de un argumento faltante si $a efectivamente se evalúa como vacío...

 [[ -n $a ]] && echo 1

...o, por supuesto, el más detallado...

 if [[ -n $a ]] then echo 1 fi

ah Se perdió la parte central de la pregunta:

 $a && echo 1

Estas son dos declaraciones, separadas por && . La segunda declaración solo se ejecuta si la primera se ejecuta correctamente. El bash separa la línea y ejecuta la primera declaración:

 $a

Este es...

 <empty>

... que es "exitoso", por lo que se ejecuta la segunda declaración. En contra de eso...

 && echo 1

... es un error de sintaxis porque no hay una primera declaración . ;-) (Complicado, lo sé, pero así es como se desmorona esta galleta).

over 4 years ago · Santiago Trujillo Report

0

a=""

o

 a=" " #a long empty string

entonces

 $> $a

devolverá 0

 $> $noExistVar

también devolverá 0.

Se "ejecutan", de hecho, no se ejecuta nada. al igual que presiona enter o presiona 10 espacios y luego ingresa, también obtiene el código de retorno 0.

 $> && echo 1

esto fallará, porque bash intentará ejecutar la primera parte, en este caso falta.

 $> $notExistVar && echo 1

Aquí funciona, supongo que bash encontró la primera parte $whatever , por lo tanto, no hay error de sintaxis. Luego "ejecútelo", bueno, nada que ejecutar, devuelva 0, (lo mismo que presionar enter después del indicador), luego verifique, si la primera parte devolvió 0, ejecute el cmd después de && .

Dije adivinar porque no revisé los códigos fuente de bash. Por favor corrígeme si está mal.

el caso $> " " && echo 1 , creo que está claro, no es necesario explicarlo.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!