Character escaping e echo comand

1

Tendo comandos simples de eco:

echo "\n"

e

echo "\n"

ambos resultam no mesmo resultado

\n

Alguém pode me explicar em detalhes como o bash processa esses comandos (char by char) e por que o resultado é o mesmo em ambos os casos?

    
por Ringger81 11.01.2018 / 11:21

2 respostas

1

A resposta curta é que \ nem sempre é especial para bash ou para echo . As aspas duplas preservam o valor da string literal de tudo dentro, exceto $ , ' , \ e, às vezes, ! . Fora as aspas duplas, \ é sempre especial para bash: ele preserva o valor da string literal do caractere seguinte. Dentro das aspas, a contra-barra \ é especial apenas quando seguida por um dos cinco caracteres: $ , ' , " , \ ou uma nova linha. Nos quatro primeiros casos, ele preserva o valor da string literal do caractere seguinte. Para a versão bash do eco, \ nunca é especial, a menos que o sinalizador -e seja fornecido.

Então, nos dois casos, o que está acontecendo:

echo "\n"

neste caso, \ não é seguido por um dos cinco caracteres mencionados e, portanto, é tratado como seu valor de string literal.

echo "\n"

neste caso, o primeiro \ é seguido por um segundo \ . O primeiro escapa do segundo, de modo que é interpretado como seu valor de string literal. Isso é inútil aqui, já que seria interpretado como seu valor de string literal de qualquer maneira , mas poderia ser útil se você quisesse imprimir uma única barra invertida no final de uma linha, como em:

echo "This is a single backslash:\"

caso contrário, a barra invertida seria interpretada pelo shell como escapando de " .

Todas essas informações podem ser obtidas da parte da página bash man sobre aspas duplas, encontradas aqui .

    
por 14.01.2018 / 04:32
0

Um único \ preserva o valor da string literal do caractere imediatamente após ele.

Então, neste caso:

echo "\n"

O primeiro \ preserva a string literal \ que fica antes do "n" . Se você fosse digitar o seguinte ...

echo "\"

... você precisaria terminar o comando, pois o interpretador não veria o "\" como uma string literal, mas estaria aguardando a entrada do usuário para escapar de um caractere "próximo".

No entanto, se o \ for incluído entre aspas simples, nenhum caractere de escape será aguardado, pois aspas simples, por si só, preservam o (s) caractere (s) literal (is) do (s) qual (is).

Então, por exemplo: echo '\'

Isso imprimiria a barra invertida como uma string literal e não como um caractere de escape, de forma que o intérprete não esperaria que o usuário incluísse um caractere.

Esta informação, e muito mais, está incluída na página man bash.

    
por 12.01.2018 / 11:28

Tags