2012-10-03 14 views
94

¿Cómo convierto los argumentos de la línea de comandos en una matriz de scripts bash?Convierta los argumentos de la línea de comando en una matriz en Bash

Quiero aprovechar esta:

./something.sh arg1 arg2 arg3 

y convertirlo en

myArray=(arg1 arg2 arg3) 

de modo que pueda utilizar miMatriz para su uso posterior en el guión.

Este SO post anterior se acerca, pero no entra en cómo crear una matriz: How do I parse command line arguments in Bash?

Necesito convertir los argumentos en una matriz regular escritura del golpe; 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 por defecto, y gracias a la respuesta a continuación, fue capaz de conseguir este trabajo:

if [ "$#" -eq 0 ]; then 
    myArray=(defaultarg1 defaultarg2) 
else 
    myArray=("[email protected]") 
fi 

Respuesta

126

realmente su argumentos de línea de comandos son prácticamente como una matriz ya. Al menos, puede tratar la variable [email protected] como una matriz. Dicho esto, se puede convertir en una matriz real como esto:

myArray=("[email protected]") 

Si lo que desea es escribir algunos argumentos y alimentarlos en el valor [email protected], utilice set:

$ set -- apple banana "kiwi fruit" 
$ echo "$#" 
3 
$ echo "[email protected]" 
apple banana kiwi fruit 

La comprensión de cómo usar la estructura de argumento es particularmente útil en POSIX sh, que no tiene nada más que una matriz.

+1

¡Gracias! ¡Funciona genial! Estaba a punto de preguntar cómo verificar cero argumentos y asignar un valor de matriz predeterminado, ¡y el $ # funciona perfectamente para eso! – Suman

+0

@kojiro ¿cuál es el significado de establecer -, gracias – mailzyok

+1

'conjunto' le permite establecer los parámetros de posición para el alcance. También le permite configurar opciones de shell. Puedes hacer 'set foo', lo que significa' $ 1' se expande a "foo", pero si tus parámetros comienzan con un guión 'set' asumirá que quieres establecer una opción de shell. El doble guión garantiza que todos los parámetros siguientes se interpreten como parámetros posicionales a establecer. – kojiro

35

Tal vez esto puede ayudar:

myArray=("[email protected]") 

también se puede iterar sobre los argumentos por omisión 'en':

for arg; do 
    echo "$arg" 
done 

será equivalente

for arg in "${myArray[@]}"; do 
    echo "$arg" 
done 
+0

Encontré que el segundo es genial – goofansu

+0

Preguntas para principiantes: ¿Cómo sabe Bash qué poner en el campo 'arg'? ¿Es una variable predefinida? '$ {var}' se expande al contenido de 'var'. '$ {var [n]}' se expande al contenido del elemento 'n' de la matriz' var'. Es '$ {var [@]}' y luego se expande la matriz completa, es decir, '$ {var [0]} $ {var [1]} ... $ {var [n]}' (con 'n'ser el índice del último elemento)? – Christian

+0

[for] without [in] hará un bucle sobre los argumentos array $ @ ($ 1, $ 2, etc.). Que se puede configurar también con el comando [set], por ejemplo set - arg1 arg2 –

4

Aquí hay otro uso:

#!/bin/bash 
array=("[email protected]") 
arraylength=${#array[@]} 
for ((i=1; i<${arraylength}+1; i++)); 
do 
    echo "${array[$i-1]}" 
done 
6

En realidad, se puede acceder a la lista de parámetros con $1 $2 ... etc.
¿Qué es exactamente equivalente a:

${!i} 

Por lo tanto, la lista de parámetros podría ser cambiado con el conjunto,
y ${!i} es la forma correcta para 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 ser utilizado (sin necesidad de matrices), para establecer la lista de argumentos cuando no se dio ninguno:

if [ "$#" -eq 0 ]; then 
    set -- defaultarg1 defaultarg2 
fi 

que se traduce en esta expresión aún más simple:

[ "$#" == "0" ] && set -- defaultarg1 defaultarg2 
4

más fácil Sin embargo, se puede operar directamente sobre [email protected];)

Aquí es cómo hacer pasar aa lista de argumentos directamente desde el indicador:

function echoarg { for stuff in "[email protected]" ; do echo $stuff ; done ; } 
echoarg Hey Ho Lets Go 
    Hey 
    Ho 
    Lets 
    Go 
Cuestiones relacionadas