Eu quero passar vários argumentos para um script bash como um único parâmetro de string para um executável externo (especialmente git
)
Encontrei várias respostas que sugerem algo assim:
"'$*'"
"'$@'"
que parece muito bom ao passar para, echo
mas falha quando passado para um programa externo, mesmo se canalizado através de echo
.
Este é um MWE:
#!/bin/bash
# preparation
git init .
git add -A
echo git commit -m "'$@'" # works when copied to terminal
git commit -m "'$@'" # fails if more than one parameter given
git commit -m $(echo "'$@'") # fails if more than one parameter given
rm -rf .git # c
resulta em:
$ bash test.sh test2 test2
empty Git-Repository in /tests/bash-scripts/.git/ initialized
git commit -m 'test1 test2'
error: pathspec 'test2'' did not match any file(s) known to git.
error: pathspec 'test2'' did not match any file(s) known to git.
Como passo vários parâmetros de script como uma única string (incluindo espaços) para um executável externo (sem envolvê-los na ""
chamada do script.
Acabei de descobrir que isso funciona:
git commit -m "$(echo "'$@'")"
mas isso me leva ao próximo nível:
Eu quero omitir o -m
parâmetro se nenhum argumento for fornecido para que o editor de mensagens de confirmação seja acionado:
if [ 0 != $# ]
then
MESSAGE ="-m " "$(echo "'$@'")"
fi
git commit $MESSAGE
ou
if [ 0 != $# ]
then
MESSAGE =("-m " "$(echo "'$@'")")
fi
echo
git commit ${MESSAGE[@]}
isso novamente falha ainda pior, as palavras citadas também são separadas.:
$bash test.sh "test1 test2" test3
git commit -m 'test1 test2 test3'
error: pathspec 'test2' did not match any file(s) known to git.
error: pathspec 'test3'' did not match any file(s) known to git.
Se você quiser interpretar todos os argumentos como uma string, use
ou seja
Está documentado em
man bash
"Parâmetros especiais":