$*
é todos os parâmetros para o script ou função, dividido em argumentos separados no espaço em branco.
Se você tem uma função:
foo() {
for x in $*
do
echo $x
done
}
então, a execução de foo 1 "2 3 4" 5
será exibida:
1
2
3
4
5
Ou seja, a string citada "2 3 4"
será dividida em três "palavras" separadas.
Quando você não deseja dividir os argumentos em palavras separadas como essa, você pode usar $@
. Se a mesma função usasse "$@"
no lugar de $*
, seria produzida:
1
2 3 4
5
Ou seja, a string citada não seria dividida em palavras separadas. Isso é como listar todos os parâmetros posicionais explicitamente: "$1" "$2" "$3" "$4" ...
. Em geral, esse é provavelmente o que você deseja usar - a divisão de palavras geralmente leva a erros desagradáveis difíceis de rastrear.
No nível superior de um script (não dentro de uma função), eles se referem aos argumentos dados ao próprio script.
Seu exemplo está chamando run_command
ou run_test
com todos os argumentos para esse script ou função, dividido em palavras separadas. Se o script fosse executado como script.sh "hello world" 2 3
, ele teria o efeito de executar:
run_command hello world 2 3