6

Каковы различия между $@ и $* ? Например, я не вижу различий здесь:

#! /bin/bash
echo with star: $*
echo with at sign: $@

2 ответа2

13

Когда они не указаны, нет разницы между $@ и $* . Оба равны $1 $2 ... Но не делайте этого.

В двойных кавычках "$@" раскрывает каждый элемент в качестве аргумента:

"$1" "$2" ...

в то время как "$*" распространяется на все элементы, объединенные в один аргумент:

"$1c$2c..."

где c - первый символ IFS . Если вы отключите IFS , c будет пробелом.

Вы почти всегда хотите "$@" . То же самое касается массивов: "${myarray[@]}"

2

У @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<

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .