Eu tenho uma versão de trabalho no Bash, mas ela usa matrizes Bash, e eu suspeito que não seja portável:
for arg in "$@"; do
args+=("-e" "$arg")
done
grep haystack.txt "${args[@]}"
Digamos que você esteja escrevendo um script de shell. Ele recebe um número arbitrário de argumentos de linha de comando e os transmite para um utilitário de linha de comando. Ao chamar esse utilitário, cada argumento precisa ser prefixado com um sinalizador. Qual é a maneira correta de escapar disso em seu script, para que o utilitário veja exatamente as mesmas sequências que o script de shell faz?
Exemplo concreto: passando expressões regulares para grep
. Você executa seu script de wrapper:
./findit.sh needle "old socks" "spare change"
E você espera que grep
seja chamado com esses argumentos como expressões de correspondência:
grep haystack.txt -e needle -e "old socks" -e "spare change"
É o prefixo -e
que complica as coisas; se não fosse necessário, você poderia usar apenas "$@"
. O que o script precisa fazer para garantir que grep
receba os argumentos corretamente? Existe uma maneira portátil de fazer isso?
Eu tenho uma versão de trabalho no Bash, mas ela usa matrizes Bash, e eu suspeito que não seja portável:
for arg in "$@"; do
args+=("-e" "$arg")
done
grep haystack.txt "${args[@]}"
Tags shell shell-script