Hay 4 fragmentos de bash a continuación. Los llamo con ./script.sh abc
for arg in $@; do echo "$arg" done ## output "a\nb\nc" for arg in "$@"; do echo "$arg" done ## output "a\nb\nc" -- I don't know why for arg in $*; do echo "$arg" done ## output "a\nb\nc" for arg in "$*"; do echo "$arg" done ## output "abc" No sé cuál es la diferencia exacta entre $@ y $* ,
y creo que "$@" y "$*" deberían ser lo mismo, pero no lo son. ¿Por qué?
Si tiene un script foo.sh :
asterisk "$*" at-sign "$@"y llamarlo con:
./foo.sh "aa" "bb" "cc"es equivalente a:
asterisk "aabbcc" at-sign "aa" "bb" "cc"Sin las comillas, son lo mismo:
asterisk $* at-sign $@sería equivalente a:
asterisk "a" "a" "b" "b" "c" "c" at-sign "a" "a" "b" "b" "c" "c"La diferencia entre $* y $@ es:
"$*" All the positional parameters (as a single word) *
"$@" All the positional parameters (as separate strings)
Si pasa tres argumentos de línea de comandos dados a un script bash a un programa C usando ./my_c $@,
obtienes el resultado ARG[1] == "par1" ARG[2] == "par2" ARG[3] == "par3"
Si pasa tres argumentos de línea de comandos dados a un script bash a un programa C usando ./my_c $*,
obtienes el resultado ARG[1] == "par1 par2 par3"
Esto es importante en los scripts de shell: por ejemplo, el script testargs.sh
#! /bin/bash -p echo $# for i in $(seq 1 $#) do echo "$i: ${!i}" done for val in "$@"; do echo "in quote @, $val" done for val in "$*"; do echo "in quote *, $val" done for val in $@; do echo "not in quote @, $val" done for val in $*; do echo "not in quote *, $val" done Si este script se ejecuta como /tmp/testargs.sh abc 'd e' , los resultados son:
4 1: a 2: b 3: c 4: de in quote @, a in quote @, b in quote @, c in quote @, de in quote *, abcde not in quote @, a not in quote @, b not in quote @, c not in quote @, d not in quote @, e not in quote *, a not in quote *, b not in quote *, c not in quote *, d not in quote *, e Por lo tanto, si se va a conservar la cantidad de argumentos, siempre use "$@" o repita cada argumento usando el bucle for i in $(seq 1 $#) . Sin comillas, ambos son iguales.