Existe uma maneira de escapar aspas no shell?

11

g. Eu quero dizer

perl -e 'print '"'"'Hello, world!'"'"', "\n";'

Existe uma maneira menos embaraçosa de o fazer, e. g. escapando de aspas simples?

Sim, sei que posso escrever

perl -e 'print q[Hello, world!], "\n"'
perl -e 'print "Hello, world!\n"'

Mas esta questão é sobre a citação no shell, não no Perl.

Estou interessado em como fazer isso em bash e csh em primeiro lugar.

    
por codeholic 01.03.2010 / 08:26

6 respostas

9

Dennis aponta as alternativas usuais em sua resposta (strings single-in-double, double-in-single, single citar concatenadas com aspas simples com escape; você já mencionou os operadores de citação customizáveis do Perl), mas talvez essa seja a resposta direta você estava procurando.

Em shells parecidos com Bourne (sh, ksh, ash, dash, bash, zsh, etc.), strings com aspas simples são completamente literais. Isso facilita a inclusão de caracteres que, de outra forma, o shell trataria especialmente sem ter que escapar deles, mas significa que o próprio caractere de aspas simples não pode ser incluído em strings entre aspas simples.

Eu me recuso a pensar nas conchas do tipo csh, já que elas estão completamente quebradas em outros aspectos (veja Programação Csh considerada prejudicial ).

    
por 01.03.2010 / 13:54
6

Para mim, todos os seus exemplos produzem:

Hello, world!

E isso acontece:

perl -e 'print "Hello, world!", "\n";'

E isso:

perl -e 'print '\''Hello, world!'\'', "\n";'

Você pode esclarecer o que está tentando fazer?

No shell, como Bash, se você deseja imprimir aspas como parte da string, um tipo de aspas escapa do outro.

$ echo '"Hello, world!"'
"Hello, world!"
$ echo "'Hello, world!'"
'Hello, world!'

Editar:

Aqui está outra maneira:

$ perl -e 'print "7Hello, world!7", "\n";'
'Hello, world!'
$ echo -e "7Hello, world! 7"
'Hello, world! '

O espaço após o ponto de exclamação evita um erro de expansão do histórico. Eu poderia ter feito set +H .

    
por 01.03.2010 / 13:12
1

Não tenho certeza se minha edição da resposta anterior seria exibida:

Colando o mesmo que uma nova resposta:

Abordagem alternativa:

Quando tentei a sua solução, ainda não consegui obter o 'impresso.

Mas tomei a sugestão da sua solução e tentei o seguinte:

$ perl -e '$foo = chr(39); print "${foo}Hello, world ${foo}", "\n";'
'Hello, world '

O valor ASCII de 'é 39.

Eu precisava disso para fazer uma edição inline para vários arquivos para adicionar 'em um local de interesse.

    
por 22.12.2011 / 08:05
0

Aqui o documento é a melhor maneira de não se preocupar em escapar:

$ cat <<EOF
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

Você pode inibir completamente a expansão usando o documento aqui citado:

$ cat <<'EOF'
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

Se você quiser passá-lo como argumento em vez de entrada, você pode usar xargs:

$ xargs -0 <<'EOF' perl -e
my $var = "Hello";
print $text, ', world!', "\n";'
EOF
    
por 11.09.2013 / 11:21
0

Eu não sei se há uma opção para fazer isso no bash, mas com o zsh você pode usar '' depois de ativar a opção RC_QUOTES . (Eu recomendaria tentar o zsh; ele é basicamente compatível com o bash e pode emular o bash para uma compatibilidade ainda maior).

Com o bash (e ainda a maior parte do tempo com o zsh), eu uso apenas '\'' porque é mais fácil de ler que '"'"' .

Eu não tenho absolutamente nenhuma ideia de como fazer isso no csh.

    
por 07.09.2017 / 22:11
-1

Você pode usar \ 'e \ "para escapar de aspas com perl se usado internamente como parte de um script em Perl. Não tenho certeza se a linha de comando aceitará isso. Você poderia tentar e ver se funciona.

    
por 01.03.2010 / 08:31