arrays - recorrer - variables en bash
Convierte argumentos de lĂnea de comando en una matriz en Bash (5)
Aquí hay otro uso:
#!/bin/bash
array=( "$@" )
arraylength=${#array[@]}
for (( i=1; i<${arraylength}+1; i++ ));
do
echo "${array[$i-1]}"
done
¿Cómo convierto los 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 que pueda usar myArray para un uso posterior en el script.
Esta publicación SO anterior se acerca, pero no explica cómo crear una matriz: ¿cómo puedo analizar los argumentos de línea de comando 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 comprobar cero argumentos y asignar un valor de matriz predeterminado, y gracias a la respuesta a continuación, pude hacer que esto funcione:
if [ "$#" -eq 0 ]; then
myArray=( defaultarg1 defaultarg2 )
else
myArray=( "$@" )
fi
En realidad, se puede acceder a la lista de parámetros con $1 $2 ...
etc.
Lo cual es exactamente equivalente a:
${!i}
Entonces, la lista de parámetros podría cambiarse con set,
y ${!i}
es la forma correcta de acceder a ellos:
$ set -- aa bb cc dd 55 ff gg hh ii jjj kkk lll
$ for ((i=0;i<=$#;i++)); do echo "$#" "$i" "${!i}"; done
12 1 aa
12 2 bb
12 3 cc
12 4 dd
12 5 55
12 6 ff
12 7 gg
12 8 hh
12 9 ii
12 10 jjj
12 11 kkk
12 12 lll
Para su caso específico, esto podría usarse (sin la necesidad de matrices), para establecer la lista de argumentos cuando no se dio ninguno:
if [ "$#" -eq 0 ]; then
set -- defaultarg1 defaultarg2
fi
lo que se traduce a esta expresión aún más simple:
[ "$#" == "0" ] && set -- defaultarg1 defaultarg2
En realidad, sus argumentos de línea de comando son prácticamente como una matriz. Al menos, puede tratar la variable $@
muy parecida a una matriz. Dicho eso, puedes convertirlo en una matriz real como esta:
myArray=( "$@" )
Si solo desea escribir algunos argumentos y enviarlos al valor $@
, use set
:
$ set -- apple banana "kiwi fruit"
$ echo "$#"
3
$ echo "$@"
apple banana kiwi fruit
Comprender cómo usar la estructura de argumentos es particularmente útil en POSIX sh, que no tiene nada más que una matriz.
Más fácil aún, puede operar directamente en $@
;)
Aquí es cómo hacer pasar una lista de argumentos directamente desde el prompt:
function echoarg { for stuff in "$@" ; do echo $stuff ; done ; }
echoarg Hey Ho Lets Go
Hey
Ho
Lets
Go
Tal vez esto puede ayudar:
myArray=("$@")
también puede iterar sobre argumentos omitiendo ''in'':
for arg; do
echo "$arg"
done
será equivalente
for arg in "${myArray[@]}"; do
echo "$arg"
done