Eu suponho que você deseja que a string seja mostrada como "shell quoted".
O comando embutido printf em ksh , bash e zsh todos entendem o %q
especificador de formato. A saída real não é padronizada e pode variar dependendo da string de entrada (veja abaixo). Devido à variação na forma da saída, você pode não ser capaz de usar a saída de um shell com outro (especialmente se seu shell de destino for um shell menos rico em recursos como ash , traço , etc.).
zsh também tem suporte para gerar citações diretamente em expansões de parâmetros:
echo "${(q)1}" # backslashes, with $'' for unprintable/invalid characters
echo "${(qq)1}" # single quotes
echo "${(qqq)1}" # double quotes
echo "${(qqqq)1}" # $'' quoting
Se você quiser “rolar o seu próprio”, a coisa mais fácil e confiável a fazer é criar o seu próprio orçamento. Um algoritmo simples segue:
- Altere as aspas simples para a sequência
'\''
.
- Agrupe o resultado entre aspas simples.
Isso funciona para shells parecidos com o Bourne, porque a citação única é completamente literal 1 . Para representar uma aspa simples, você finaliza a atual cotação entre aspas simples, fornece uma aspa simples com escape de barra invertida e retorna uma única citando o restante da string. O algoritmo acima é ineficiente quando se lida com execuções de aspas simples e consecutivas e aspas simples no início e no final da string, mas é muito confiável e simples de implementar.
1 A aspas simples em outros idiomas geralmente não são completamente literais (no mínimo, elas geralmente permitem que algumas barras invertidas limitadas escapem). É por isso que é extremamente importante que você conheça todas as regras de cotação para a forma de cotação que você estará gerando (ou seja, em que idioma / contexto o texto citado será usado).
Aqui estão alguns exemplos de printf %q
nos shells que eu instalei localmente:
for s in /bin/ksh {,/opt/local}/bin/bash {,/opt/local}/bin/zsh
do
"$s" --version | head -1
"$s" -c 'printf "%q\n" "$@"' - \$sad\$test \'mixed\ quotes\" back\'tick
echo
done
Saída:
version sh (AT&T Research) 1993-12-28 s+
'$sad$test'
$'\'mixed quotes"'
'back'tick'
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)
\$sad\$test
\'mixed\ quotes\"
back\'tick
GNU bash, version 4.2.10(2)-release (i386-apple-darwin10.7.0)
\$sad\$test
\'mixed\ quotes\"
back\'tick
zsh 4.3.9 (i386-apple-darwin10.0)
\$sad\$test
\'mixed\ quotes\"
back\'tick
zsh 4.3.12 (i386-apple-darwin10.7.0)
\$sad\$test
\'mixed\ quotes\"
back\'tick
Vemos que ksh parece "gostar" de citar com aspas simples e usa a forma $''
em alguns casos. Os outros shells parecem usar principalmente escapes de barra invertida (embora eles também usem $''
se alguns caracteres estiverem presentes).