¿Cómo convierto argumentos de línea de comandos en una matriz de script bash?
Quiero tomar esto:
./something.sh arg1 arg2 arg3
y convertirlo a
myArray=( arg1 arg2 arg3 )
para poder usar myArray para usarlo más en el script.
Esta publicación SO anterior se acerca, pero no explica cómo crear una matriz: ¿Cómo analizo los argumentos de la línea de comandos en Bash?
Necesito convertir los argumentos en una matriz de script bash regular; Me doy cuenta de que podría usar otros lenguajes (Python, por ejemplo) pero necesito hacer esto en bash. ¿Supongo que estoy buscando una función de "agregar" o algo similar?
ACTUALIZACIÓN: También quería preguntar cómo verificar cero argumentos y asignar un valor de matriz predeterminado, y gracias a la respuesta a continuación, pude hacer que esto funcionara:
if [ "$#" -eq 0 ]; then
myArray=( defaultarg1 defaultarg2 )
else
myArray=( "$@" )
fi
set
le permite establecer parámetros posicionales para el alcance. También le permite establecer opciones de shell. Puede hacerloset foo
, lo que significa que se$1
expande a "foo", pero si sus parámetros comienzan con un guiónset
supondrá que quiere establecer una opción de shell. El doble guión garantiza que todos los siguientes parámetros se interpreten como parámetros posicionales que se establecerán.echo $@
imprimirá todos los argumentos, peroecho $myArray
solo imprimirá el primer elemento. Para verlos a todos, useecho ${myArray[@]}
."${myArray[@]}"
. Si desea recorrer la matriz, necesita las comillas para evitar dividir sus elementos individuales en IFSQuizás esto pueda ayudar:
También puede iterar sobre argumentos omitiendo 'in':
será equivalente
fuente
arg
campo? ¿Es una variable predefinida?${var}
se expande al contenido devar
.${var[n]}
se expande al contenido del elementon
de la matrizvar
. ¿Se está${var[@]}
expandiendo toda la matriz, es decir${var[0]} ${var[1]} ... ${var[n]}
(n
siendo el índice del último elemento)?En realidad, se puede acceder a la lista de parámetros con
$1 $2 ...
etc.,que es exactamente equivalente a:
Entonces, la lista de parámetros podría cambiarse con set,
y
${!i}
es la forma correcta de acceder a ellos:Para su caso específico, esto podría usarse (sin la necesidad de matrices), para establecer la lista de argumentos cuando no se proporcionó ninguno:
lo que se traduce en esta expresión aún más simple:
fuente
echo "$#" "$i+1" "${!i}";
para obtener la salida exactamente como se muestra?Aquí hay otro uso:
fuente
Más fácil Sin embargo, puede operar directamente en
$@
;)Aquí se explica cómo pasar una lista de argumentos directamente desde el indicador:
fuente
for stuff in "$@" ; do ...
es lo mismo quefor stuff ; do ...
:)Vista de lado a lado de cómo la matriz y $ @ son prácticamente iguales.
Código:
Entrada:
Salida:
fuente
Vale la pena destacar la importancia de las comillas dobles. Supongamos que un argumento contiene espacios en blanco.
Código:
Salida:
fuente