2015-08-31 2 views
4

Я прочитал Trying to embed newline in a variable in bash, и я думаю, что я понимаю, о новых строках как МФС, и как Баш изменения в новых строках пробелов в разы, но я не понимаю эту ситуации:Bash с переменным встроенным новой строкой в ​​конце переменной

[prompt]$ blah="$(printf "hi\n\n\n\n")" 
[prompt]$ echo "$blah" 
hi 
[prompt]$ blah="$(printf "hi\n\n\n\nx")" 
[prompt]$ echo "$blah" 
hi 



x 

Почему первое эхо не выплюнул кучу новых строк? Благодарю.

+0

Вы можете избежать подстановки команд в целом с помощью 'printf -v blah 'hi \ n \ n \ n \ n" или 'blah = $' hi \ n \ n \ n \ n''. – chepner

+0

Для тех, кто находится дома, вы можете прочитать о синтаксисе '$ 'string'', выполнив' man bash' и выполнив поиск 'доллара'. Вернитесь назад о странице, чтобы прочитать все об этом. –

ответ

5

Потому что это то, что the spec говорит, что оболочка должна делать. А именно, полосковые последовательности строк новой строки.

Из спецификации (курсив мой):

Оболочка должна расширить подстановки команд, выполнив команду в среде подоболочки (см Shell Execution Environment) и заменив команду подстановки (текст команды плюс включая «$()» или backquotes) со стандартным выходом команды, удаление последовательностей одной или нескольких символов символов в конце подстановки. Встраиваемые символы новой строки перед окончанием вывода не удаляются; однако они могут рассматриваться как полевые разделители и исключаться при разделении поля в зависимости от значения IFS и цитирования, которое действует. Если вывод содержит нулевые байты, поведение не задано.

Смежные вопросы