В чем разница между $@ и $* в сценарии оболочки?

in my script.sh:

aa=$@
bb=$*
echo $aa
echo $bb

при запуске:

 source script.sh a b c d e f g

Я получил:

a b c d e f g
a b c d e f g

В чем разница между $@ и $* ?


person 0x90    schedule 24.03.2013    source источник
comment
@mat Почему Google не нашел все остальные дубликаты?   -  person 0x90    schedule 24.03.2013
comment
@0x90: Google индексирует не знаки препинания, а только слова; попробуйте symbolhound для подобных вещей.   -  person Gordon Davisson    schedule 24.03.2013


Ответы (1)


Между $* и $@ нет разницы, но есть разница между "$@" и "$*".

$ cat 1.sh
mkdir "$*"

$ cat 2.sh
mkdir "$@"

$ sh 1.sh a "b c" d

$ ls -l
total 12
-rw-r--r-- 1 igor igor   11 mar 24 10:20 1.sh
-rw-r--r-- 1 igor igor   11 mar 24 10:20 2.sh
drwxr-xr-x 2 igor igor 4096 mar 24 10:21 a b c d

Мы дали скрипту три аргумента (a, b c и d), но в "$*" все они были объединены в один аргумент a b c d.

$ sh 2.sh a "b c" d

$ ls -l
total 24
-rw-r--r-- 1 igor igor   11 mar 24 10:20 1.sh
-rw-r--r-- 1 igor igor   11 mar 24 10:20 2.sh
drwxr-xr-x 2 igor igor 4096 mar 24 10:21 a
drwxr-xr-x 2 igor igor 4096 mar 24 10:21 a b c d
drwxr-xr-x 2 igor igor 4096 mar 24 10:21 b c
drwxr-xr-x 2 igor igor 4096 mar 24 10:21 d

Здесь видно, что "$*" всегда означает один единственный аргумент, а "$@" содержит столько же аргументов, сколько было в скрипте. «$@» — это специальный токен, означающий «заключить каждый отдельный аргумент в кавычки». Таким образом, a "b c" d становится (или, скорее, остается) "a" "b c" "d" вместо "a b c d" ("$*") или "a" "b" "c" "d" ($@ или $*).

Кроме того, я бы порекомендовал это прекрасное чтение на тему:

http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST

person Igor Chubin    schedule 24.03.2013