POSIX sh equivalente para printf% de Bash q
Suponha que eu tenha um#!/bin/sh
script que pode ter uma variedade de parâmetros posicionais, alguns dos quais podem incluir espaços, ambos / ambos os tipos de citações, etc. Eu quero iterar"$@"
e para cada argumento, processe-o imediatamente de alguma forma ou salve-o para mais tarde. No final do roteiro eu quero lançar (talvezexec
) outro processo, passando alguns desses parâmetros com todos os caracteres especiais intactos.
Se eu não estivesse fazendo nenhum processamento nos parâmetros,othercmd "$@"
funcionaria bem, mas preciso extrair alguns parâmetros e processá-los um pouco.
Se eu pudesse assumir Bash, então eu poderia usarprintf %q
calcular versões citadas de args que eu poderiaeval
mais tarde, mas isto não funcionaria em, e. Traço do Ubuntu (/bin/sh
).
Existe algum equivalente aprintf %q
que pode ser escrito em um shell script Bourne simples, usando apenas utilitários integrados e definidos por POSIX, como uma função que eu poderia copiar em um script?
Por exemplo, um script tentandols
seus argumentos na ordem inversa:
#!/bin/sh
args=
for arg in "$@"
do
args="'$arg' $args"
done
eval "ls $args"
funciona para muitos casos:
$ ./handle goodbye "cruel world"
ls: cannot access cruel world: No such file or directory
ls: cannot access goodbye: No such file or directory
mas não quando'
é usado:
$ ./handle goodbye "cruel'st world"
./handle: 1: eval: Syntax error: Unterminated quoted string
e o seguinte funciona bem, mas depende do Bash:
#!/bin/bash
args=
for arg in "$@"
do
printf -v argq '%q' "$arg"
args="$argq $args"
done
eval "ls $args"