Cómo recorrer los argumentos en un script bash

16

Me gustaría escribir un script bash con una cantidad desconocida de argumentos.

¿Cómo puedo analizar estos argumentos y hacer algo con ellos?

Un intento equivocado se vería así:

#!/bin/bash
for i in $args; do 
    echo $i
done
rubo77
fuente

Respuestas:

28

Hay una sintaxis especial para esto:

for i do
  printf '%s\n' "$i"
done

De manera más general, la lista de parámetros del script o función actual está disponible a través de la variable especial $@ .

for i in "$@"; do
  printf '%s\n' "$i"
done

Tenga en cuenta que necesita las comillas dobles $@, de lo contrario, los parámetros se someterán a expansión de comodines y división de campos. "$@"es mágico: a pesar de las comillas dobles, se expande en tantos campos como parámetros.

print_arguments () {
  for i in "$@"; do printf '%s\n' "$i"; done
}
print_arguments 'hello world' '*' 'special  !\characters' '-n' # prints 4 lines
print_arguments ''                                             # prints one empty line
print_arguments                                                # prints nothing
Gilles 'SO- deja de ser malvado'
fuente
5
#! /usr/bin/env bash
for f in "$@"; do
  echo "$f"
done

Debe citar $@porque es posible que los argumentos contengan espacios (o nuevas líneas, etc.) si los cita o escapa de ellos con a \. Por ejemplo:

./myscript one 'two three'

Eso son dos argumentos en lugar de tres, debido a las citas. Si no cita $@, esos argumentos se dividirán dentro del script.

maldad
fuente
2
Hay una taquigrafía para estofor f; do ...
Glenn Jackman