[email protected] - программирование" />

Разница между $* и [email protected]

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