Разница между $* и $@
Возможный дубликат:
Какая разница между "$@" и "$*" в 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 получает один аргумент.