Каково различие между “$” и “$*” в Bash? [дубликат]

Этот вопрос уже имеет ответ здесь:

Мне что они оба хранилище все параметры командной строки кажется.

Так существует ли различие между двумя?

65
задан Stefan van den Akker 9 August 2014 в 19:28
поделиться

1 ответ

Разница тонкая; "$*" создает один аргумент, разделенный переменной $IFS, в то время как "$@" будет расширяться на отдельные аргументы. В качестве примера рассмотрим:

for i in "$@"; do echo "@ '$i'"; done
for i in "$*"; do echo "* '$i'"; done

При выполнении с несколькими аргументами:

./testvar foo bar baz 'long arg'
@ 'foo'
@ 'bar'
@ 'baz'
@ 'long arg'
* 'foo bar baz long arg'

Подробнее:

http://www.gnu.org/software/bash/manual/bashref.html#Special-Parameters

$*

Расширяется до позиционных параметров, начиная с одного. Если расширение происходит внутри двойных кавычек, оно расширяется до одного слова со значением каждого параметра, разделенного первым символом специальной переменной IFS. То есть, "$*" эквивалентно "$1c$2c...", где c - первый символ значения переменной IFS. Если IFS не задана, параметры разделяются пробелами. Если IFS равна null, параметры объединяются без промежуточных разделителей.

$@

Расширение до позиционных параметров, начиная с единицы. Если расширение происходит внутри двойных кавычек, каждый параметр расширяется до отдельного слова. То есть, "$@" эквивалентно "$1" "$2" .... Если расширение в двойных кавычках происходит внутри слова, то расширение первого параметра объединяется с начальной частью исходного слова, а расширение последнего параметра - с последней частью исходного слова. Когда позиционные параметры отсутствуют, "$@" и $@ расширяются до нуля (т.е. удаляются).

97
ответ дан 24 November 2019 в 15:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: