Обычно то, что находится внутри двойных кавычек, учитывается для одного слова, и поэтому оно считается для одного параметра при вызове программы с «...». Является ли "$ @" исключением, поскольку оно разбито на столько слов, сколько параметров передается в сценарий оболочки?
1
1 ответ
4
Отчасти да, но тоже нет. Это другой вид расщепления.
$@
относится к массиву; Bash также позволяет использовать в качестве регулярных переменных массивы и поддерживает такие расширения, как ${var[*]}
или ${var[@]}
. Последнее также распространяется на все значения $ var как отдельные слова.
Однако, если раскрытие было внутри двойных кавычек, то каждое отдельное значение по- прежнему ведет себя так, как если бы оно было заключено в кавычки - то есть разбиение слов не происходит. Так что в этом отношении нет никаких исключений - $@
против "$@"
все равно то же самое, что и $foo
против "$foo"
.
демонстрация
$ var=("Item 1" "Item 2 has spaces" "Item 3? Item 3.") $ declare -p var declare -a var=([0]="Item 1" [1]="Item 2 has spaces" [2]="Item 3? Item 3.") $ args "${var[*]}" argc = 2 argv[0] = args argv[1] = Item 1 Item 2 has spaces Item 3? Item 3. $ args "${var[@]}" argc = 4 argv[0] = args argv[1] = Item 1 argv[2] = Item 2 has spaces argv[3] = Item 3? Item 3. $ args ${var[@]} argc = 11 argv[0] = args argv[1] = Item argv[2] = 1 argv[3] = Item argv[4] = 2 argv[5] = has ...