Термин «список» не совсем конкретный технический термин в bash;он используется в грамматике для ссылки на последовательность команд (например, тело цикла for
или содержимое скрипта), и это использование показано в документации о структуре программы, но это оченьконкретный тип списка.
В контексте, о котором вы спрашиваете, я бы сказал, что «список» - это значение , которое состоит из любого числа (включая 0) слов * оболочки.Аргументы для одной команды - это такой список.
Слово оболочки, в свою очередь, это то, что вы можете назвать одной строкой на другом языке.Обычно, когда вы набираете командную строку, она разделяется на слова символами, перечисленными в $IFS
(обычно пробелами, то есть пробелами и горизонтальными табуляциями), но вы можете избежать этого с помощью любого из различных механизмов цитирования и, таким образом, создатьслова оболочки, содержащие символы IFS.
Если вы хотите сохранить список в параметре оболочки, этот параметр должен быть array ;в этом случае каждое слово списка становится элементом массива.Например, список аргументов, передаваемых в команду, доступен в массиве по умолчанию, доступ к которому осуществляется через $
, за которым следует индекс, который будет заключен в квадратные скобки в именованной ссылке на массив, например, "$@"
для всехэлементы превращаются обратно в список, "$0"
для первого элемента (который является именем команды) и т. д.
Когда массив возвращается обратно в список слов, у вас есть три варианта;элементы массива могут быть сохранены такими, какими они были изначально, независимо от содержимого ("$@"
);они могут быть объединены вместе, соединены пробелами в одно большое слово оболочки ("$*"
), или их можно сначала объединить в одну большую строку, а затем повторно проанализировать в слова, используя обычные правила пробела ($@
)или $*
без кавычек).
За исключением нескольких встроенных функций, таких как mapfile
(он же readarray
), bash не имеет большой поддержки массивов.Например, среда может содержать только строки, поэтому вы не можете export
массив.Вы не можете передать массив в функцию как массив, хотя вы, конечно, можете использовать значение массива (или часть массива) как (некоторые или все) список переданных аргументовк функции.Вы также можете передать name массива в функцию, которая затем может использовать ссылки на имена и eval
для манипулирования этим массивом в области его вызова;хотя это обычно считается плохой практикой.И, конечно, функция не может вернуть массив, но тогда функция bash не может вернуть ничего, кроме однобайтового числового кода выхода.Он может выводить текст, но этот текст неструктурирован;если вызывающий объект захватывает его с помощью подстановки команды или процесса, он может проанализировать текст по своему усмотрению - например, создать массив, содержащий одно слово элемента для каждой строки вывода, что является поведением по умолчанию mapfile
/ readarray
.
В любом случае, суть в том, что списки - это значения, а массивы - это контейнеры, в которых хранятся значения списков.Технически, параметры оболочки (иначе говоря, «переменные») могут быть массивами, а в качестве массивов они могут содержать списки;они не могут быть списками, и на самом деле не имеет смысла ссылаться на «значение массива».Но неофициально, «массив» и «список» часто используются взаимозаменяемо;такова природа ленивых людей и текучесть скорлупы.