o que significa $ * no shell [duplicado]

7

O que significa $* no shell?

Eu tenho duas funções de código, run_command e run_test , elas são chamadas assim:

if [ -n "'echo ${GOAT_COMMANDS} | grep $1'" ]; then
  run_command $*
else
  run_test $*
fi

Eu quero entender o que $* significa, mas a pesquisa do Google é muito ruim para pesquisar esse tipo de coisa.

    
por Zhenxiao Hao 08.07.2014 / 10:17

4 respostas

9

$* é 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
    
por 08.07.2014 / 10:29
2

$* significa todos os parâmetros posicionais .

    
por 08.07.2014 / 10:30
2

$* significa passar todos os parâmetros para a função como um único 'parâmetro'. Também é aconselhável ter aspas duplas em torno dessa variável "$*" .

Alguns documentos sobre esta aqui seção 3.2.5

Por outro lado, se você precisar iterar através de cada um dos parâmetros contidos na lista de argumentos, use $@ , como neste ex:

for var in "$@"
do
    echo "$var"
done

Aqui está outro exemplo: foo.sh

#!/bin/bash    
foo1()
{
        for x in "$@"
        do
                echo "f1: $x"
        done
}

foo2()
{
        for x in "$*"
        do
                echo "f2: $x"
        done
}

foo1 1 2 "3 4 5" 6 7
echo
foo2 1 2 "3 4 5" 6 7

saída :

$  ./foo.sh 
f1: 1
f1: 2
f1: 3 4 5
f1: 6
f1: 7

f2: 1 2 3 4 5 6 7
    
por 08.07.2014 / 10:31
1

$* é a lista dos parâmetros posicionais, mas com a divisão de palavras. Por exemplo, em

your_script ab "cd ef"

$* fornecerá 3 argumentos: ab , cd e ef . Usar "$@" é muito mais seguro (a menos que você deseje dividir palavras).

    
por 08.07.2014 / 10:31