$ '\ n' entre aspas duplas não funciona

2

Eu quero enviar uma string que contém o caractere de nova linha como um argumento de linha de comando para o meu programa, os seguintes trabalhos:

myprogram Hello$'\n'World

Mas quando eu uso aspas duplas na string:

myprogram "Hello$'\n'World Hello Again"

Em seguida, a string recebida por myprogram conterá a string $'\n' e não o caractere de nova linha.

    
por user267935 02.01.2018 / 18:49

4 respostas

3

A construção $'…' não funciona se for citada. Use:

$ myprogram "Hello"$'\n'"World Hello Again"

ou

$ myprogram Hello$'\n'World\ Hello\ Again

ou

$ a=$'\n'
$ myprogram "Hello${a}World Hello Again"

ou

$ myprogram "$(echo -e 'Hello\nWorld Hello Again')"

ou

$ myprogram "Hello
World Hello Again"
    
por 02.01.2018 / 18:58
0

Alternadamente,

myprogram "$(printf '%s\n' "Hello" "world once" "World Hello Again")"

O comando printf irá reutilizar a string de formato para consumir todos os argumentos fornecidos. Além disso, a sintaxe $() removerá automaticamente todas as novas linhas finais.

    
por 02.01.2018 / 19:19
0

A string não precisa estar contida em um par de aspas abrangente; strings individualmente citadas podem ser concatenadas em uma palavra.

myprogram Hello$'\n'"World Hello Again"

As citações não definem uma string; eles simplesmente escapam de todos os personagens que ocorrem entre eles.

    
por 03.01.2018 / 02:48
0

Interessante que em três respostas, ninguém apontou a solução mais simples:

myprogram $'Hello\nWorld Hello Again'

Como a cotação do dólar é (sem dúvida) uma forma de cotação , use isso para todo o argumento.

É claro que vale a pena entender que as citações NÃO são delimitadores de qualquer tipo no bash. Espaço em branco é usado para dividir palavras - aspas não delimitam o ponto em que um argumento termina e outro começa. Isso significa que você pode misturar livremente métodos de cotação em um único argumento. (Há uma boa descrição disto em outro lugar neste site já; eu verei se posso encontrá-lo e vinculá-lo a ele.)

    
por 03.01.2018 / 07:32

Tags