Механизм разбиения по словам Bash
Я новичок в Bash и вижу, что Bash выполняет автоматическое разбиение слов:
a="1 2 3 4"
Если я повторяю "а" echo $a
я получил 1 2 3 4
, который сделал расщепление слова неявно. Если я переберу "а", то получу 1, 2, 3 и 4 соответственно.
Я также прочитал отсюда, что
Оболочка сканирует результаты раскрытия параметров, подстановки команд и арифметического раскрытия, которые не встречались в двойных кавычках для разделения слов.
И я также обнаружил, что если у меня есть
b=$a;
echo "$b"
я бы получил
"1 2 3 4"
Итак, вот моя проблема: когда делится слово? это меняет саму строку? Действует ли это только когда я использую echo
или же for
(Цикл)?
В целом, как Bash справляется с этим?
3 ответа
Читать man bash
, Для назначения это говорит
Все значения подвергаются раскрытию тильды, расширению параметров и переменных, подстановке команд, расширению арифметики и удалению кавычек [ ... ] Разделение слов не выполняется, за исключением "$@", как описано ниже в разделе "Специальные параметры". Расширение пути не выполняется.
Разделение слов также не происходит в [[ ]]
условия:
Разделение слов и расширение пути не выполняются над словами между [[и]]
На самом деле есть несколько раундов разделения слов. Первый выполняется до разбора командной строки, поэтому echo $a
делится на два слова echo
а также $a
, (Вот почему то вроде a="echo foo | wc -l"; $a
не выполняет конвейер; Разбор завершен до $a
расширен). После того, как этот раунд разделения слова закончен, происходит расширение параметра, чтобы произвести 2 строки, echo
а также 1 2 3 4
, Строка, полученная в результате раскрытия параметра, подвергается самому разбиению по словам, поскольку она не заключена в кавычки, что приводит к появлению 4 дополнительных слов. 1
, 2
, 3
, а также 4
,
В цикле for элементы в списке могут быть разделены по словам:
for b in $a; do
раскрывается (после разделения слов производит for
, b
, in
, $a
, ;
, а также do
) чтобы for
, b
, in
, 1 2 3 4
, ;
, а также do
, Снова строка, полученная в результате расширения параметра, подвергается разбиению на слова 1
, 2
, 3
, а также 4
,
Bash работает следующим образом - при разборе скрипта или командной строки:
- разбор и лексический анализ
- расширение
- расширение скобки
- расширение тидла
- переменное расширение
- арифметика и другие замены
- подстановка команд
- разделение слов
- генерация имени файла
- удаление цитат
Как вы можете видеть, разделение слов почти в конце, поэтому после, например, арифметического расширения, но до появления имени файла, удаление кавычек является последним шагом.