![¿Cuándo comienza el bucle con while [ -n "$1" ]; ejecuta?](https://rvso.com/image/146500/%C2%BFCu%C3%A1ndo%20comienza%20el%20bucle%20con%20while%20%5B%20-n%20%22%241%22%20%5D%3B%20ejecuta%3F.png)
Tengo un script de shell con un bucle while que comienza con
while [ -n "$1" ]; do
Sé que $1
se refiere al argumento justo después del nombre del script, es decir firstargument
, cuando lo ejecuto ./myscript.sh firstargument
. ¿Qué hacen -n
?
Respuesta1
Es -n
una 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 shift
declaración para cambiar el siguiente parámetro posicional $1
y 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 test
utilidad 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 test
esté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 -n
prueba es también una de lasestándarpruebas y por lo tanto también figuran enel estándar POSIX para la test
utilidad.
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.