como expressar o avanço de linha no shell?

1

Im meu 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  

No meu arquivo de teste, é:

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

O que eu quero é o seguinte:

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

como expressar o feed de linha corretamente?

    
por it_is_a_literature 24.02.2015 / 02:35

3 respostas

2

Inclua apenas uma nova linha dentro das aspas (isso funciona com aspas simples ou duplas). Observe que, se a segunda linha for recuada, os espaços farão parte da string. Além disso, use sempre aspas duplas substituições de variáveis .

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 e zsh (mas não sh simples) têm uma sintaxe alternativa de aspas $'…' em que a barra invertida inicia uma seqüência de escape semelhante a C, portanto você pode escrever \n para representar uma nova linha. No seu caso, seria menos legível:

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

Um documento aqui é muitas vezes uma maneira mais legível de apresentar strings de múltiplas linhas. Note que um documento aqui é passado como entrada padrão para o comando, não como um argumento de linha de comando.

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

¹ Ou mais geralmente como entrada se você especificar um descritor de arquivo alternativo.

    
por 25.02.2015 / 01:43
3

Além da sugestão de jasonwryan, sugiro usar 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

Como printf reutiliza a string de formato até que os argumentos tenham sido esgotados, ela fornece uma boa maneira de imprimir linhas repetitivas.

    
por 24.02.2015 / 03:11
0

Uma opção é usar echo -e para expandir as seqüências de escape. A segunda opção é simplesmente usar uma nova linha "literal" (funciona em bash ):

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

Observe a notação $'···' para inserir um literal.

No entanto, ter novas linhas em variáveis como essa não é uma boa ideia. É mais difícil ler o script, pode levar a erros tolos e comportamentos indesejados se "$str" for dado a outros programas que não entendem as seqüências de escape (se \n for usado) ou usar a divisão de palavras ( $'' caso). Basta usar uma matriz e iterar sobre ela, isso a tornará mais extensível se você tiver mais linhas.

Se você quer apenas isso em um lugar no código, eu o dividi em dois comandos de eco, que pelo menos não podem dar errado.

Outra interessante e provavelmente a melhor solução se você quiser apenas colocá-la em um arquivo, é um documento aqui:

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

Leitura adicional: link

    
por 24.02.2015 / 09:19