как выразить строку в оболочке?

Im мой debian7.8 bash shell.

str="deb http://ftp.cn.debian.org/debian/ wheezy main contrib non-free \n deb-src http://ftp.cn.debian.org/debian/ wheezy main contrib non-free " echo $str > test 

В моем тестовом файле это:

 deb http://ftp.cn.debian.org/debian/ wheezy main contrib non-free \n deb-src http://ftp.cn.debian.org/debian/ wheezy main contrib non-free 

Я хочу, чтобы:

 deb http://ftp.cn.debian.org/debian/ wheezy main contrib non-free deb-src http://ftp.cn.debian.org/debian/ wheezy main contrib non-free 

как правильно выразить линию подачи?

3 Solutions collect form web for “как выразить строку в оболочке?”

Просто включите фактическую строку новой строки внутри кавычек (это работает как с одиночными, так и с двойными кавычками). Обратите внимание: если вторая строка имеет отступ, пробелы являются частью строки. Кроме того, всегда используйте двойные кавычки вокруг переменных подстановок .

 str="deb http://ftp.cn.debian.org/debian/ wheezy main contrib non-free deb-src http://ftp.cn.debian.org/debian/ wheezy main contrib non-free" echo "$str" > test 

Ksh, bash и zsh (но не простые sh) имеют альтернативный синтаксис цитирования $'…' в котором обратная косая черта начинает C-подобную escape-последовательность, поэтому вы можете написать \n для представления новой строки. В вашем случае это будет менее читаемо:

 str=$'deb http://ftp.cn.debian.org/debian/ wheezy main contrib non-free\ndeb-src http://ftp.cn.debian.org/debian/ wheezy main contrib non-free' echo "$str" > test 

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

 cat <<EOF >test deb http://ftp.cn.debian.org/debian/ wheezy main contrib non-free deb-src http://ftp.cn.debian.org/debian/ wheezy main contrib non-free EOF 

¹ Или в общем случае в качестве ввода, если вы укажете альтернативный файловый дескриптор.

Помимо предложения Джейсонвреяна, я бы предложил использовать printf :

 $ printf "%s http://ftp.cn.debian.org/debian/ wheezy main contrib non-free\n" deb deb-src > test $ cat test deb http://ftp.cn.debian.org/debian/ wheezy main contrib non-free deb-src http://ftp.cn.debian.org/debian/ wheezy main contrib non-free 

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

Один из вариантов – использовать echo -e для расширения управляющих последовательностей. Второй вариант – просто использовать «литерал» новой строки (работает в bash ):

 str = "deb ... non-free "$'\n'"deb-src ... non-free " echo "$str" 

Обратите внимание на нотацию $'···' для вставки литерала.

Однако наличие новых строк в таких переменных, как это, не является хорошей идеей. Труднее прочитать сценарий, это может привести к глупым ошибкам и нежелательному поведению, если "$str" предоставляется другим программам, которые либо не понимают escape-последовательности (если \n используется), либо использует разбиение слов ( $'' дело). Просто используйте массив и перейдите по нему, он сделает его более расширяемым, если у вас больше строк.

Если вы просто хотите, чтобы это было в одном месте в коде, я бы разделил его на две команды эха, которые по крайней мере не ошибетесь.

Еще одно интересное и, вероятно, лучшее решение, если вы просто хотите поместить его в файл, – это документ здесь:

 cat > test <<EOF deb http://ftp.cn.debian.org/debian/ wheezy main contrib non-free deb-src http://ftp.cn.debian.org/debian/ wheezy main contrib non-free EOF 

Дальнейшее чтение: https://stackoverflow.com/questions/9139401/trying-to-embed-newline-in-a-variable-in-bash

  • Долларовая интерполяция знаков внутри кавычек в bash
  • почему grep '\ ;.' expand to grep '\' '\;.' \ '' 'при выполнении над ssh?
  • Какие символы должны быть экранированы в аргументах командной строки?
  • Почему эти вложенные параметры в сценарии оболочки POSIX разделены словом?
  • Почему расширение переменной bash сохраняет кавычки?
  • Скобка в команде echo shell
  • bash: невозможно установить переменную в сплошную строку
  • В чем разница, имеющая двойные кавычки или нет в bash
  • Использование ссылки на строковую переменную bash в sed
  • Как выйти из скрипта в сеансе ssh?
  • Передача аргументов с кавычками и двойными значениями в сценарий bash
  • Linux и Unix - лучшая ОС в мире.