Разница между $* и $@

Возможный дубликат:
Какая разница между "$@" и "$*" в bash?

В течение многих лет и в десятки раз я колебался между использованием $* а также $@ в сценариях оболочки. Прочитав соответствующий раздел руководства Bash снова и снова, попробовав оба $* а также $@Я более или менее полностью не понимаю практическую разницу в применении двух переменных. Можете ли вы просветить меня, пожалуйста?

Я использую $* недавно, но не спрашивайте меня, почему. Я не знаю почему, потому что я не знаю почему $@ даже существует, за исключением как почти точный синоним $*,

Есть ли практическая разница?

(Лично я склонен использовать Bash, но остаюсь агностиком в отношении выбора оболочки. Насколько я знаю, мой вопрос не относится к Bash).

3 ответа

Решение

Без кавычек нет никакой разницы - они распространяются на все аргументы и делятся соответственно. Разница возникает при цитировании. "$@" расширяется до правильно процитированных аргументов и "$*" делает все аргументы в один аргумент. Возьмите это к примеру:

#!/bin/bash

function print_args_at {
    printf "%s\n" "$@"
}

function print_args_star {
    printf "%s\n" "$*"
}

print_args_at "one" "two three" "four"
print_args_star "one" "two three" "four"

Затем:

$ ./printf.sh 

one
two three
four

one two three four

Рассматривать:

foo() { mv "$@"; } 
bar() { mv "$*"; }
foo a b
bar a b

Вызов foo попытается передать mv файл a в b. Вызов bar будет неудачным, поскольку он вызывает mv только с одним аргументом.

Обратите внимание, что "$@" это магия, только когда в кавычках больше ничего нет. Они идентичны:

set -- a "b c" d
some_func "foo $*"  
some_func "foo $@"

В обоих случаях some_func получает один аргумент.

Другие вопросы по тегам