Этот пост на самом деле содержит два отдельных вопроса, но я думаю, что их объединение даст больше контекста. Я прошел через этот вопрос о кавычках вокруг переменных, но я не совсем понимаю, что означает расширение переменных . Итак, мой первый вопрос:
- Что говорят расширения переменных в unix / linux?
Вторая часть моего вопроса относится к следующим терминам:
- Glob
- Трещина
Что означают вышеизложенные и как они влияют на расширение переменных? Ответ на оригинальный вопрос упоминает следующее:
Думайте об отсутствии кавычек (в контексте списка) как оператора split + glob.
Как будто echo $ test был echo glob (split ("$ test")).
Я не смог найти никаких ответов, которые бы непосредственно касались концепции глобализации и расщепления, а скорее использовали эти термины непосредственно при ответе на другие вопросы, такие как этот недавний .
источник
Ответы:
Расширение переменной (стандартный термин - расширение параметра , и его также иногда называют заменой переменной ) в основном означает замену переменной ее значением. Точнее, это означает замену
$VARIABLE
конструкции (или${VARIABLE}
(${VARIABLE#TEXT}
или) других конструкций) каким-либо другим текстом, который построен из значения переменной. Этот другой текст является расширением переменной.Процесс расширения идет следующим образом. (Я обсуждаю только общий случай, некоторые настройки оболочки и расширения изменяют поведение.)
${VARIABLE#TEXT}
, а значение переменной начинается сTEXT
, удалитеTEXT
из начала значения.IFS
может быть изменена для разделения на символы, отличные от пробелов.) Таким образом, результатом является уже не строка, а список строк. Этот список может быть пустым, если значение содержит только пробелы.Например, предположим, что переменная
foo
содержит,a* b* c*
а текущий каталог содержит файлыbar
,baz
иpaz
. Затем${foo#??}
расширяется следующим образом:a* b* c*
.#??
означает удаление первых двух символов, в результатеb* c*
получается строка из 6 символов (с начальным пробелом).b*
иc*
.b*
, интерпретируемая как шаблон, соответствует двум файлам:bar
иbaz
. Строка неc*
соответствует ни одному файлу, поэтому она остается одна. Результатом является список из трех строк:bar
,baz
,c*
.Например,
echo ${foo#??}
печатаетbar baz c*
(командаecho
объединяет свои аргументы с пробелом между ними).Для более подробной информации смотрите:
источник
$var
) и другим типам параметров , такие как$1
,$#
,$?
,$-
...Glob / раскол
Я сначала возьму шар / сплит. @ Ответ Стефана, на который вы ссылаетесь, использует эти термины в общем смысле. Это не настоящие команды или что-то в этом роде, а просто псевдо-операции.
Это
split("$test")
разделит содержимое «$ test» на «массив» элементов.Затем
glob(...)
он позаботится о расширении любого из этих элементов, которые содержат символы-заглушки оболочки, такие как*
или диапазоны[1-2]
.пример
Скажем, наша строка
$test
выглядит следующим образом.Также допустим, что у нас есть каталог с некоторыми файлами.
Теперь, если мы попытаемся отобразить его без кавычек, вы должны заметить, что наша строка разделена пробелами, а затем все символы-заглушки расширились.
Однако, если бы мы указали переменную в кавычках, когда передавали ее в качестве аргумента,
echo
мы получили бы исходную буквенную строку.переменное расширение
Термин «расширение переменной» предназначен для обозначения основной операции, выполняемой оболочкой в рамках основных операций. Оболочка отвечает за синтаксический анализ входных данных, а затем за выполнение этих входных данных, если они считаются синтаксически правильными.
В нашем предыдущем примере. Когда переменная
$test
была представлена безecho
кавычек, мы говорили оболочке идти дальше, разбивать эти аргументы и затем их выводить.Когда оно было заключено в кавычки, мы фактически отключали эту функцию тем, что когда-либо было изменено в двойных кавычках.
пример
Вот несколько дополнительных примеров срыва и расщепления.
шар / расщепление происходит автоматически
Glob / расщепление отключено через двойные кавычки
источник