2013-08-28 2 views
1

Я новичок в Bash, и я вижу, что есть автоматическое разбиение слов осуществляются Bash:Баша слова Расщепление механизм

a="1 2  3 4" 

Если я эхо «а» на echo $a я 1 2 3 4, который сделал слово расщепления неявно. Если я прохожу через «a», я получил 1, 2, 3 и 4 соответственно.

Я также читать из here, что

Оболочка сканирует результаты расширения параметров, команда замены, и арифметическое расширения, которое не происходило в течение двойных кавычек для слова расщепления.

И я также обнаружил, что если у меня есть

b=$a; 
echo "$b" 

Я хотел бы получить

"1 2 3 4" 

Итак, вот моя проблема: когда слово расщепление сделано? он сам меняет строку? Используется ли это только тогда, когда я использую echo или for (цикл)? Более общий, как баш справляется с этим на земле?

Большое спасибо!

ответ

1

Прочитано man bash. Для задания, он говорит

Все значения подвергаются тильды, параметров и переменных расширения, подстановки команд, арифметическое расширение и удаление кавычек [...] Слово расщепления не производится, за исключением «$ @» как описано ниже в разделе «Специальные параметры». Расширение имени пути не выполняется.

Слово расщепления также не происходит в [[ ]] условиях:

Слово расщепления и подстановка имен файлов не выполняются на словах между [[и]]

+0

Большое спасибо! Но делает ли bash слово разбиение по вызову, а не только один раз? Я имею в виду, что Баш всегда выполняет расщепление всякий раз, когда он считает необходимым, но не просто сделать это в первый раз, а затем сохранить его? Если он много раз делится на одну строку, я думаю, что эффективность не очень хорошо рассмотрена? – dragonxlwang

0

Есть на самом деле несколько раунды расщепления слов. Первый выполняется перед анализом командной строки, поэтому echo $a разделяется на два слова echo и $a. (Вот почему что-то вроде a="echo foo | wc -l"; $a не выполняет конвейер, разбор завершен до того, как будет развернут $a). После окончания раунда разделения слов происходит расширение параметра, чтобы произвести 2 строки, echo и 1 2 3 4. Строка, возникающая в результате расширения параметра, затем претерпевает расщепление слов, так как она не цитируется, производя 4 дополнительных слова 1, 2, 3 и 4.

в цикле, элементы в списке могут быть слова-расщеплением:

for b in $a; do 

расширяется (после того, как слово-расщепление производит for, b, in, $a, ; и do) до for, b, in, 1 2 3 4, ; и do. Снова строка, возникающая в результате расширения параметра, претерпевает разбиение на слова до 1, 2, 3 и 4.

0

Bash работает в следующем - при анализе сценария или командной строки:

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

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