Каковы различия между $@
и $*
?
Например, я не вижу различий здесь:
#! /bin/bash
echo with star: $*
echo with at sign: $@
Каковы различия между $@
и $*
?
Например, я не вижу различий здесь:
#! /bin/bash
echo with star: $*
echo with at sign: $@
Когда они не указаны, нет разницы между $@
и $*
. Оба равны $1
$2
... Но не делайте этого.
В двойных кавычках "$@"
раскрывает каждый элемент в качестве аргумента:
"$1"
"$2"
...
в то время как "$*"
распространяется на все элементы, объединенные в один аргумент:
"$1c$2c..."
где c
- первый символ IFS
. Если вы отключите IFS
, c
будет пробелом.
Вы почти всегда хотите "$@"
. То же самое касается массивов: "${myarray[@]}"
У @sputnick правильный ответ. Для демонстрации на примере:
# 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" "$@"
)
выходы
$*:
>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<