En muchas preguntas SO y tutoriales de bash, veo que puedo acceder a los argumentos de la línea de comandos en scripts de bash de dos maneras:
$ ~ >cat testargs.sh
#!/bin/bash
echo "you passed me" $*
echo "you passed me" $@
Lo que resulta en:
$ ~> bash testargs.sh arg1 arg2
you passed me arg1 arg2
you passed me arg1 arg2
¿Cuál es la diferencia entre $*
y $@
?
¿Cuándo se debe usar el primero y cuándo se debe usar el segundo?
bash
command-line-arguments
Oz123
fuente
fuente
echo "something $@"
como un errorRespuestas:
La diferencia aparece cuando se citan los parámetros especiales. Permítanme ilustrar las diferencias:
Otro ejemplo sobre la importancia de las citas: tenga en cuenta que hay 2 espacios entre "arg" y el número, pero si no puedo citar $ word:
y en bash,
"$@"
es la lista "predeterminada" para iterar:fuente
$*
o"$*"
puede ser requerido, y el propósito no puede ser cumplido por$@
o"$@"
?"$@"
con las comillas.Una bonita y práctica tabla de resumen de Bash Hackers Wiki :
donde
c
en la tercera fila está el primer carácter de$IFS
, el separador de campo interno, una variable de shell.Si los argumentos se van a almacenar en una variable de script y se espera que contengan espacios, recomiendo encarecidamente emplear un
"$*"
truco con el separador de campo interno$IFS
establecido en tab .fuente
$IFS
significa "Separador de campo interno".PS
PS
Fuente: Bash Man
fuente
$ @ es igual a $ *, pero cada parámetro es una cadena entre comillas, es decir, los parámetros se pasan intactos, sin interpretación ni expansión. Esto significa, entre otras cosas, que cada parámetro en la lista de argumentos se ve como una palabra separada.
Por supuesto, se debe citar "$ @".
http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST
fuente
Este ejemplo permite resaltar la diferencia entre "at" y "asterix" mientras los usamos. Declaré dos matrices de "frutas" y "verduras"
Vea el siguiente resultado del código anterior:
fuente