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
В чем разница между $@
и $*
?
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
В чем разница между $@
и $*
?
Между $*
и $@
нет разницы, но есть разница между "$@"
и "$*"
.
$ 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