2012-03-28 4 views
20

Возможный дубликат:
What the difference between “[email protected]” and “$*” in bash?

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

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

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

(.. Я лично предпочитаю использовать Bash, но остаются агностик относительно выбора оболочки Мой вопрос не относится к Bash, насколько я знаю)

+1

Поиск по [$ * $ @] (http://symbolhound.com/?q=%24%40+%24*) на SymbolHound находит несколько дубликатов. Удобный инструмент. –

+1

(Также, например, http://stackoverflow.com/questions/3307672/whats-the-difference-between-and-in-unix, http://stackoverflow.com/questions/2761723/what-is-the -difference-between-and-in-shell-scripts, http://stackoverflow.com/questions/4491115/what-is-the-internal-processing-of-and.) –

+0

@ChrisMorgan: подтверждено во всех точках. SymbolHound выглядит удобно. Я не знал об этом. В следующий раз, я буду искать там в первую очередь. Должен ли я принять какие-то меры, чтобы объединить мой вопрос с тем, который вы предлагаете? – thb

ответ

46

Не указано, нет никакой разницы - они расширены до всех аргументов, и они разделены соответственно. Разница возникает при цитировании. "[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 
5

Рассмотрим:

foo() { mv "[email protected]"; } 
bar() { mv "$*"; } 
foo a b 
bar a b 

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

+0

Спасибо. Являются ли * $ @ * и * $ \ ** то же, если они используются без кавычек? – thb

+3

Без кавычек $ @ и $ * идентичны. –

+2

Кроме того, на некоторых сломанных оболочках '' $ @ "' расширяется до пустого аргумента '' '', если нет позиционных параметров, а не правильно расширяется до нуля.Таким образом, этот трюк должен использоваться: '$ {@ +" $ @ "}' (если '$ @' является непустым, замените '' $ @ "' else nothing). Если вы когда-нибудь это увидите, вы поймете, почему. – Kaz

4

Заметим также, что "[email protected]" магия только, когда нет ничего в кавычках. Они идентичны:

set -- a "b c" d 
some_func "foo $*" 
some_func "foo [email protected]" 

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