¿Cuándo comienza el bucle con while [ -n "$1" ]; ejecuta?

¿Cuándo comienza el bucle con while [ -n "$1" ]; ejecuta?

Tengo un script de shell con un bucle while que comienza con

while [ -n "$1" ]; do

Sé que $1se refiere al argumento justo después del nombre del script, es decir firstargument, cuando lo ejecuto ./myscript.sh firstargument. ¿Qué hacen -n?

Respuesta1

Es -nuna prueba para una cadena no vacía.

Si "$1"se expande a una cadena vacía, entonces esa prueba en particular falla y el bucle no se ejecutará.

Esprobableque el cuerpo del bucle contiene una shiftdeclaración para cambiar el siguiente parámetro posicional $1y que el bucle de esta manera recorre los argumentos del script, hasta que encuentra un argumento vacío o llega al final de la lista de argumentos.

La testutilidad es equivalente a [, pero [requiere que el último argumento sea ].

La prueba también podría escribirse como

while test -n "$1"; do

Es probable que ambos [y testestén integrados en su shell, pero también deberían estar disponibles como comandos externos en una ruta estándar como /bin.

Podrás leer más sobre esta y otras pruebas en man test, así como en el manual de tu shell (ya que es una utilidad incorporada).

Esta -nprueba es también una de lasestándarpruebas y por lo tanto también figuran enel estándar POSIX para la testutilidad.


Sise supone que este bucle se repitetodoargumentos del script de shell, es posible que no lo haga si un argumento está vacío:

$ sh -c 'while [ -n "$1" ]; do printf "arg: %s\n" "$1"; shift; done' sh 1 2 3 "" 4 5 6
arg: 1
arg: 2
arg: 3

En su lugar, posiblemente debería usar algo como

for arg do
    if [ -n "$arg" ]; then
        # do something with "$arg"
    fi
done

... dependiendo de lo que haga el guión, obviamente.

información relacionada