Como escapar aspas no shell?

55

Estou com problemas para escapar de personagens no bash. Gostaria de escapar de aspas simples e duplas ao executar um comando sob um usuário diferente. Para os propósitos desta pergunta, digamos que eu queira repetir o seguinte na tela:

'single quote phrase' "double quote phrase"

Como posso escapar de todos os caracteres especiais, se eu também precisar mudar para um usuário diferente:

sudo su USER -c "echo \"'single quote phrase' \"double quote phrase\"\""

Claro, isso não produz o resultado correto.

    
por m33lky 05.02.2012 / 05:48

5 respostas

67

Você pode usar a seguinte sintaxe literal de string:

> echo $'\'single quote phrase\' "double quote phrase"'
'single quote phrase' "double quote phrase"

De man bash

Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard. Backslash escape sequences, if present, are decoded as follows:

          \a     alert (bell)
          \b     backspace
          \e
          \E     an escape character
          \f     form feed
          \n     new line
          \r     carriage return
          \t     horizontal tab
          \v     vertical tab
          \     backslash
          \'     single quote
          \"     double quote
          \nnn   the eight-bit character whose value is the octal value nnn (one to three digits)
          \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
          \cx    a control-x character
    
por 05.02.2012 / 05:50
9

Em um shell POSIX, supondo que em sua string não exista variável, comando ou expansão de histórico, e não há nova linha, siga estas prescrições básicas:

  1. Para citar uma string genérica com aspas simples, execute as seguintes ações:

    1. Substitua qualquer sequência de caracteres que não sejam aspas simples pela mesma sequência com aspas simples iniciais e finais: 'aaa' ==> ''aaa''

    2. Escape com uma barra invertida em todos os caracteres de aspas simples pré-existentes : ' ==> \'
      Em particular, ''aaa'' ==> \''aaa'\'

  2. Para citar uma string genérica com aspas duplas, execute as seguintes ações:

    1. Adicione aspas duplas iniciais e finais: aaa ==> "aaa"

    2. Escape com uma barra invertida a cada caractere de aspas duplas e todos os caracteres de barra invertida: " ==> \", \ ==> \

Alguns exemplos:

''aaa""bbb''ccc\ddd''  ==>  \'\''aaa""bbb'\'\''ccc\ddd'\'\'
                        ==>  "''aaa\"\"bbb''ccc\\ddd''"

para que o seu exemplo possa ser expandido com o seguinte:

#!/bin/sh

echo \''aaa'\'' "bbb"'
echo "'aaa' \"bbb\""

sudo su enzotib -c 'echo \'\'\''aaa'\''\'\'\'' "bbb"'\'
sudo su enzotib -c 'echo "'\''aaa'\'' \"bbb\""'

sudo su enzotib -c "echo \''aaa'\'' \"bbb\"'"
sudo su enzotib -c "echo \"'aaa' \\"bbb\\"\""
    
por 05.02.2012 / 17:04
8

Exemplo simples de escape de citações no shell:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

É feito terminando um já aberto ( ' ), colocando um com escape ( \' ), depois abrindo outro ( ' ).

Alternativamente:

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

É feito terminando uma vez já aberta ( ' ), colocando a cotação em outra cotação ( "'" ), depois abrindo outra ( ' ).

Relacionados: Como escapar de aspas simples dentro de strings entre aspas simples? em stackoverflow SE

    
por 28.02.2015 / 22:22
1

A resposta aceita funciona para citações simples (um nível):

$ echo $'\'single quote phrase\' "double quote phrase"'
'single quote phrase' "double quote phrase"

Para que o comando apresentado funcione, é necessário citar duas vezes.
Este script pode fazer todo o trabalho:

#!/bin/bash

quote () { 
    local quoted=${1//\'/\'\\'\'};
    printf "'%s'" "$quoted"
}

read -r line <<-\_line_to_quote_
'single quote phrase' "double quote phrase"
_line_to_quote_

quote "$line"; echo
quote "echo $(quote "$line")"; echo

Execute o script para obter:

$ script
''\''single quote phrase'\'' "double quote phrase"'
'echo '\'''\''\'\'''\''single quote phrase'\''\'\'''\'' "double quote phrase"'\'''

A primeira linha funciona para um eco simples:

$ echo ''\''single quote phrase'\'' "double quote phrase"'
'single quote phrase' "double quote phrase"

A segunda linha funcionará para o comando com aspas duplas:

sudo su USER -c 'echo '\'''\''\'\'''\''single quote phrase'\''\'\'''\'' "double quote phrase"'\'''
    
por 21.11.2015 / 12:56
-1

echo 'eu sou um estudante' não funciona. Mas os seguintes trabalhos:

echo $ 'eu sou estudante' Da página man do bash:

Uma aspa simples pode não ocorrer entre aspas simples, mesmo quando precedidas por uma barra invertida. .... Palavras do formulário $ 'string' são tratadas especialmente. A palavra se expande para string, com caracteres de escape com barra invertida substituídos conforme especificado pelo padrão ANSI C.

    
por 03.01.2018 / 06:35