1

Обычно то, что находится внутри двойных кавычек, учитывается для одного слова, и поэтому оно считается для одного параметра при вызове программы с «...». Является ли "$ @" исключением, поскольку оно разбито на столько слов, сколько параметров передается в сценарий оболочки?

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
...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .