Dennis aponta as alternativas usuais em sua resposta (seqüências de caracteres simples, duplas, duplas, simples, concatenadas com aspas simples escapadas; você já mencionou os operadores de cotação personalizáveis de Perl), mas talvez essa seja a resposta direta que você estava procurando para.
Em shells tipo Bourne (sh, ksh, ash, dash, bash, zsh, etc.), as seqüências de citação simples são completamente literais. Isso facilita a inclusão de caracteres que o shell trataria especialmente sem precisar escapar deles, mas significa que o próprio caractere de aspas simples não pode ser incluído em seqüências de caracteres entre aspas simples.
Obrigado. "Isso é impossível" - é a resposta que eu esperava :) Embora eu sempre esperasse que fosse aqui os documentos dedicados a desempenhar esse papel.
codeholic
Diferentemente do Perl, os documentos do shell tipo Bourne aqui são apenas diretamente úteis para fornecer informações via stdin. Você pode, é claro, colocar aspas simples nelas. Você também pode ativar o "modo literal" de um documento aqui, citando a palavra: (por exemplo) blah <<\EOF … EOF. Você também pode usar <<'EOF'e <<"EOF. Todos eles significam documentos literais aqui (diferentemente do Perl). Se você estivesse realmente determinado, poderia fazê-lo blah "$(cat<<\EOF … EOF )" other args(usando novas linhas onde escrevi espaços na substituição de comando; ksh e zsh podem ficar sem o gato , os outros precisam). Mas valeria mesmo a pena?
precisa
Só quero observar que as aspas simples do zsh não são muito literais. O Zsh tentará interpretar um '\ U' em qualquer lugar de uma string de aspas simples como um código de caractere, por exemplo, echo '\U0000068\U000069'ecoa 'hi'. Não sei por que, a menos que seja um bug no shell.
Matthew
1
@ Matthew: A interpretação \Unesse caso está sendo feita pelo comando de eco-E interno (esse comportamento pode ser controlado por ou pela opção BSD_ECHO e -e). Você pode ver que a cadeia literal é passada (e não interpretada de outra forma) em outros comandos; por exemplo printf %s\\n '\U0000068\U000069'.
31813 Chris Johnsen
@ ChrisJohnsen Obrigado, sou novo no zsh e não percebi isso, mas você está certo. A página de manual me disse que -e é o padrão, mas o zsh deve substituir isso.
Mateus
5
Para mim, todos os seus exemplos produzem:
Olá Mundo!
E o mesmo acontece:
perl -e 'print "Hello, world!", "\n";'
E isto:
perl -e 'print '\''Hello, world!'\'', "\n";'
Você pode esclarecer o que está tentando fazer?
No shell, como o Bash, se você desejar imprimir aspas como parte da sequência, um tipo de aspas escapará do outro.
Não sei se existe uma opção para fazer isso no bash, mas com o zsh você pode usar ''depois de ativar a RC_QUOTESopção. (Eu recomendaria tentar o zsh; é principalmente compatível com o bash e pode emular o bash para ainda mais compatibilidade.)
Com o bash (e ainda na maioria das vezes com o zsh), eu apenas uso '\''porque é mais fácil de ler do que '"'"'.
Não tenho absolutamente nenhuma idéia de como fazê-lo no csh.
Você pode usar \ 'e \ "para escapar de aspas com perl se usado internamente como parte de um script perl. Não tenho certeza se a linha de comando aceitará isso. Você pode tentar e ver se funciona.
blah <<\EOF … EOF
. Você também pode usar<<'EOF'
e<<"EOF
. Todos eles significam documentos literais aqui (diferentemente do Perl). Se você estivesse realmente determinado, poderia fazê-loblah "$(cat<<\EOF … EOF )" other args
(usando novas linhas onde escrevi espaços na substituição de comando; ksh e zsh podem ficar sem o gato , os outros precisam). Mas valeria mesmo a pena?echo '\U0000068\U000069'
ecoa 'hi'. Não sei por que, a menos que seja um bug no shell.\U
nesse caso está sendo feita pelo comando de eco-E
interno (esse comportamento pode ser controlado por ou pela opção BSD_ECHO e-e
). Você pode ver que a cadeia literal é passada (e não interpretada de outra forma) em outros comandos; por exemploprintf %s\\n '\U0000068\U000069'
.Para mim, todos os seus exemplos produzem:
E o mesmo acontece:
E isto:
Você pode esclarecer o que está tentando fazer?
No shell, como o Bash, se você desejar imprimir aspas como parte da sequência, um tipo de aspas escapará do outro.
Editar:
Aqui está outra maneira:
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
.fonte
Não tenho certeza se minha edição da resposta anterior seria exibida:
Colando o mesmo que uma nova resposta:
Abordagem alternativa:
Quando tentei sua solução, ainda não consegui imprimir o '.
Mas peguei a sugestão da sua solução e tentei o seguinte:
O valor ASCII de 'é 39.
Eu precisava disso para fazer uma edição embutida em vários arquivos para adicionar 'em um local de interesse.
fonte
Aqui, o documento é a melhor maneira de não se importar com a fuga:
Você pode inibir completamente toda a expansão usando o documento citado aqui:
Se você deseja passá-lo como argumento, em vez de entrada, você pode usar xargs:
fonte
Não sei se existe uma opção para fazer isso no bash, mas com o zsh você pode usar
''
depois de ativar aRC_QUOTES
opção. (Eu recomendaria tentar o zsh; é principalmente compatível com o bash e pode emular o bash para ainda mais compatibilidade.)Com o bash (e ainda na maioria das vezes com o zsh), eu apenas uso
'\''
porque é mais fácil de ler do que'"'"'
.Não tenho absolutamente nenhuma idéia de como fazê-lo no csh.
fonte
Você pode usar \ 'e \ "para escapar de aspas com perl se usado internamente como parte de um script perl. Não tenho certeza se a linha de comando aceitará isso. Você pode tentar e ver se funciona.
fonte