Возможный дубликат:
Какая разница между "[email protected]" и "$*" в bash?
В течение многих лет и десятков раз я колебался между использованием $*
и [email protected]
в сценариях оболочки. Прочитав соответствующий раздел Bash manpage снова и снова, попробовав как $*
, так и [email protected]
, я более или менее полностью не понимаю практическую разницу между двумя переменными. Можете ли вы просветить меня, пожалуйста?
Я недавно использовал $*
, но не спрашиваю, почему. Я не знаю, почему, потому что я не знаю, почему [email protected]
даже существует, кроме как почти точный синоним для $*
.
Есть ли какая-то практическая разница?
(Я лично предпочитаю использовать Bash, но остаюсь агностиком относительно выбора оболочки. Мой вопрос не зависит от Bash, насколько я знаю.)
Ответы
Ответ 1
Без кавычек, нет никакой разницы - они расширяются до всех аргументов, и они разделяются соответственно. Разница возникает при цитировании. "[email protected]"
расширяется до правильно цитируемых аргументов, а "$*"
делает все аргументы одним аргументом. Возьмите это, например:
#!/bin/bash
function print_args_at {
printf "%s\n" "[email protected]"
}
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
Ответ 2
Рассмотрим:
foo() { mv "[email protected]"; }
bar() { mv "$*"; }
foo a b
bar a b
Вызов foo попытается выполнить mv файл a на b. Вызов на бар не удастся, так как он вызывает mv только с одним аргументом.
Ответ 3
Обратите внимание, что "[email protected]"
является магическим, только если в кавычках нет ничего другого. Они идентичны:
set -- a "b c" d
some_func "foo $*"
some_func "foo [email protected]"
В обоих случаях some_func получает один аргумент.