Механизм разбиения по словам 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 работает следующим образом - при разборе скрипта или командной строки:

  1. разбор и лексический анализ
  2. расширение
    1. расширение скобки
    2. расширение тидла
    3. переменное расширение
    4. арифметика и другие замены
    5. подстановка команд
    6. разделение слов
    7. генерация имени файла
  3. удаление цитат

Как вы можете видеть, разделение слов почти в конце, поэтому после, например, арифметического расширения, но до появления имени файла, удаление кавычек является последним шагом.

Другие вопросы по тегам