Ao usar "${args[@]}"
, você assume que args
é uma matriz, mas não é.
Para que args
seja uma matriz, você deve atribuir a ela uma atribuição de matriz, como
args=( "$@" )
Para que os elementos da matriz sejam citados individualmente quando você expande ${args[@]}
, é necessário colocar aspas duplas na expansão (assim como com "$@"
):
echo git "$cmd" "${args[@]}"
Neste exemplo simples, a matriz args
separada não é realmente necessária:
#!/bin/sh
cmd=$1
shift
if [ "$cmd" = "bar" ]; then
set -- --baz "$@"
fi
echo git "$cmd" "$@"
Observe que as citações não serão geradas pelo comando echo
acima. Mas você pode ter certeza de que echo
obtém exatamente dois argumentos ( git
e $cmd
), mas no entanto, muitas coisas estão em $@
nesse ponto. Isso ocorre porque o shell cota a remoção no comando antes de executá-lo. Você pode comparar isso com o que, por exemplo echo "one two" three
de saídas.
Uma maneira melhor de gerar o comando para inspeção visual talvez seja
printf 'Arg: %s\n' git "$cmd" "$@"
Isto imprimiria cada argumento separado para printf
em sua própria linha (prefixado pela string Arg:
).
Seu comando git
, git "$cmd" "$@"
(ou git "$cmd" "${args[@]}"
se você usar uma matriz separada) seria executado corretamente (considerando que as variáveis fazem sentido, o% comumgit
não tem bar
sub- comando com uma opção --baz
, por exemplo).
Relacionados: