Diferenças em scripts do bash entre $ @ e $ *

6

Quais são as diferenças entre $@ e $* ? Por exemplo, não vejo diferenças aqui:

#! /bin/bash
echo with star: $*
echo with at sign: $@
    
por tyranitar 20.01.2013 / 15:05

2 respostas

13

Quando não são citados, não há diferença entre $@ e $* . Ambos são iguais a $1 $2 … Mas não faça isso.

Com aspas duplas, "$@" expande cada elemento como um argumento:

"$1" "$2"

enquanto "$*" se expande para todos os elementos mesclados em um único argumento:

"$1c$2c..."

em que c é o primeiro caractere de IFS . Se você desmarcar IFS , c será um espaço.

Você quase sempre deseja "$@" . O mesmo vale para matrizes: "${myarray[@]}"

    
por 20.01.2013 / 15:08
2

@sputnick tem a resposta certa. Para demonstrar com um exemplo: \

# use two positional parameters, each with whitespace
set -- "one two" "three four"

# demonstrate the various forms with the default $IFS
echo '$*:'
printf ">%s<\n" $*
echo '$@:'
printf ">%s<\n" $@
echo '"$*":'
printf ">%s<\n" "$*"
echo '"$@":'
printf ">%s<\n" "$@"

# now with a custom $IFS
(
IFS=:
echo '$*:'
printf ">%s<\n" $*
echo '$@:'
printf ">%s<\n" $@
echo '"$*":'
printf ">%s<\n" "$*"
echo '"$@":'
printf ">%s<\n" "$@"
)

saídas

$*:
>one<
>two<
>three<
>four<
$@:
>one<
>two<
>three<
>four<
"$*":
>one two three four<
"$@":
>one two<
>three four<
$*:
>one two<
>three four<
$@:
>one two<
>three four<
"$*":
>one two:three four<
"$@":
>one two<
>three four<
    
por 20.01.2013 / 19:57