2016-12-06 2 views
1

Ниже моя игрушка программаshell выводит многострочный текст под bash?

[email protected]:~/Desktop$ foo=$'line1\nline2' 
[email protected]:~/Desktop$ echo $foo 
line1 line2 
[email protected]:~/Desktop$ echo "$foo" 
line1 
line2 

Я знаю механизм цитирования на языке командной оболочки. Мое ожидание - это две команды эха, которые будут выводить одну и ту же вещь, так как знак доллара является мета-кутрактором в любом случае в виде открытого текста и двойного qouting. Так почему это другое. Это какая-то вложенная qutation?

+1

@DevNull Спасибо, я знал этот путь. Моя реальная проблема в том, почему echo $ foo и echo «$ foo» ведут себя по-другому здесь – nathan

+0

Ahh, после просмотра принятого ответа, я вижу то, что вы искали. Ну, рад, что это сработало. Ура! – DevNull

ответ

3

Разница между цитируемой и некотируемыми версиями может зависеть от оболочки, но, скорее всего, является:

  • цитировал, "$foo" представляет собой единственный аргумент, который передается в echo команду, которая печатает его дословно, а затем по новой линии.
  • unquoted, $foo раскрывается до набора аргументов, разделенных $IFS. Если $IFS не установлен, по умолчанию используется пробел, и если разделителя поля нет, у вас есть только одно поле.

В некотируемой версии, нет никаких оснований ожидать, что новая строка будет считаться частью продукции, так как это не на самом деле даже часть ввода к команде echo. Он просто отделяет аргументы.

Если вы хотите изменить это поведение, вы можете изменить настройку $IFS, но я не рекомендую. Измените IFS, когда вам нужно обрабатывать поля, а не форматировать вывод.

Для прогнозируемого выхода следуйте рекомендациям POSIX.1 и не используйте echo. Вместо этого используйте printf.

+1

Допустимо использовать 'IFS' для форматирования вывода как разделителя полей с элементами массива (' '$ {array [*]}" ') или' '$ *" ', но опять же, что действует только в двойных кавычках , – cdarke

+2

@ghoti Большое спасибо. Я думаю, вы правы. Я также попробовал $ 'line1 \ tline2', который подтвердил ваше объяснение – nathan

+1

FYI, я считаю, что это официальный документ. «Если в двойных кавычках происходит расширение параметра: Расширение имени пути не должно выполняться по результатам расширения. Разделение поля не должно производиться по результатам расширения, за исключением« @ », см. Специальные параметры «. – nathan

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