Curiosamente, em muitas conchas getopts
é um candidato muito provável para um trabalho como este. Isso pode parecer contra-intuitivo no começo, mas se você considerar que getopts
'a função principal é reconhecer e oferecer a interpretação tantas opções de linha de comando de um caractere especificadas quanto as encontradas em uma série concatenada do mesmo, pode começar a se tornar um pouco mais sentido.
Para demonstrar, a partir de um bash
shell:
x=$(printf '\n\r%010s\t' hello)
OPTIND=1
while getopts : na "-$x"
do printf %q\\n "$OPTARG"
done
$'\n'
$'\r'
\
\
\
\
\
h
e
l
l
o
$'\t'
Dessa forma, às vezes pode ser conveniente permitir getopts
lidar com a desmontagem como uma espécie de piloto automático do shell para casos como este. Ao fazer isso, você pode apenas filtrar bytes indesejados com / case
ou [
testar ]
e criar seu backup de string a partir do byte 1:
OPTIND=1 y=$(printf \\n\\r) z=
while getopts : na "-$x"
do case $OPTARG in ([!$y])
z=$z$OPTARG
esac
done
printf %q\\n "$z"
$' hello\t'
Dado este exemplo de caso simples - e considerando um shell que suporta as expansões de parâmetros já mencionadas em outros lugares -, as expansões provavelmente servirão melhor aqui. Mas pensei getopts
que valeria a pena mencionar também, caso você não estivesse ciente de suas capacidades nesse aspecto. Certamente, quando soube disso, encontrei muitos aplicativos úteis para ele, de qualquer maneira.
printf '%q\n' "$string"
obter uma versão escapada de qualquer string. Por exemplo:printf '%q\n' 'foo\n'
->foo\\n
;printf '%q\n' $'foo\n'
->$'foo\n'