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

StackOverflow https://stackoverflow.com/questions/1483721

  •  18-09-2019
  •  | 
  •  

Вопрос

На этот вопрос уже есть ответ здесь:

Я пишу сценарий оболочки, который будет сохранять вывод команды в переменной, обрабатывать вывод, а затем отображать результаты.Вот что у меня есть:

stuff=$(diff -u pens tape)
# process the output
echo $stuff

Проблема в том, что результат, который я получаю при запуске скрипта, следующий:

--- pens 2009-09-27 10:29:06.000000000 -0400 +++ tape 2009-09-18 16:45:08.000000000 -0400 @@ -1,4 +1,2 @@ -highlighter -marker -pencil -POSIX +masking +duct

Хотя я ожидал этого:

--- pens 2009-09-27 10:29:06.000000000 -0400
+++ tape 2009-09-18 16:45:08.000000000 -0400
@@ -1,4 +1,2 @@
-highlighter
-marker
-pencil
-POSIX
+masking
+duct

Похоже, символы новой строки каким-то образом удаляются.Как мне заставить их сказать «входи»?

Это было полезно?

Решение

Если вы хотите сохранить символы новой строки, заключите переменную в двойные кавычки:

echo "$stuff"

Когда вы пишете это без двойных кавычек, оболочка расширяется. $stuff в список слов, разделенных пробелами (где «слова» — это последовательности символов, не являющихся пробелами, а символы пробела — это пробелы, табуляции и новые строки);в результате экспериментов оказалось, что переводы страниц, возвраты каретки и обратные пробелы не считаются пробелом).


Демонстрация интерпретации управляющих символов как пробелов.ASCII 8 — возврат назад, 9 — табуляция, 10 — новая строка (LF), 11 — вертикальная табуляция, 12 — перевод страницы, 13 — возврат каретки.Первая команда генерирует последовательность символов, разделенных различными управляющими символами.Вторая команда возвращает результат с сохранением исходных символов — см. шестнадцатеричный дамп.Третья команда повторяет результат, разделяя слова оболочкой;вы можете видеть, что табуляция и новая строка были заменены пробелами (0x20).

$ x=$(./ascii 64 65 8 66 67 9 68 69 10 70 71 11 72 73 12 74 75 13 76 77)
$ echo "$x" | odx
0x0000: 40 41 08 42 43 09 44 45 0A 46 47 0B 48 49 0C 4A   @A.BC.DE.FG.HI.J
0x0010: 4B 0D 4C 4D 0A                                    K.LM.
0x0015:
$ echo  $x  | odx
0x0000: 40 41 08 42 43 20 44 45 20 46 47 0B 48 49 0C 4A   @A.BC DE FG.HI.J
0x0010: 4B 0D 4C 4D 0A                                    K.LM.
0x0015:
$ 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top