В чем разница между $ @ и $ * в сценариях оболочки? - PullRequest
51 голосов
/ 04 мая 2010

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

Какой способ получения аргументов скрипта является предпочтительным?

Есть ли различия между различными интерпретаторами оболочки по этому поводу?

Ответы [ 3 ]

60 голосов
/ 04 мая 2010

С здесь :

$ @ ведет себя как $ * за исключением того, что в кавычках аргументы разбиваются правильно, если в них есть пробелы.

Возьмем, к примеру, этот скрипт (взято из связанного ответа):

for var in "$@"
do
    echo "$var"
done

Даёт это:

$ sh test.sh 1 2 '3 4'
1
2
3 4

Теперь измените "$@" на $*:

for var in $*
do
    echo "$var"
done

И вы получите это:

$ sh test.sh 1 2 '3 4'
1
2
3
4

(Ответ найден с помощью Google )

14 голосов
/ 10 января 2013

A key отличие от моего POV в том, что "$ @" сохраняет исходное число аргументов. Это только форма, которая делает. По этой причине это очень удобно для передачи аргументов в сценарии.

Например, если файл my_script содержит:

#!/bin/bash

main()
{
   echo 'MAIN sees ' $# ' args'
}

main $*
main $@

main "$*"
main "$@"

### end ###

и я запускаю это так:

my_script 'a b c' d e

Я получу этот вывод:

MAIN видит 5 аргументов

MAIN видит 5 аргументов

MAIN видит 1 аргумент

MAIN видит 3 аргумента

1 голос
/ 04 мая 2010

С $ @ каждый параметр является строкой в ​​кавычках. В противном случае он ведет себя так же.

См .: http://tldp.org/LDP/abs/html/internalvariables.html#APPREF

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...