O parâmetro especial bash $ @ é tratado como um loop no printf?

4

Estou testando o seguinte:

foo() {  
  printf "\nAll the parameters, each on a separate line:\n"  
  printf "param: %s\n" "$@"  
}  

foo The "nicely colored" rainbow  

A saída é:

All the parameters:  
param: The
param: nicely colored
param: rainbow

Portanto, se eu entendi corretamente porque IFS está definido como \t\n , obtemos os parâmetros separados por tabulação (o primeiro caractere de IFS ).
Mas por que eles são impressos em linhas separadas?
O printf é executado para cada parâmetro. Ou seja o bash converte isso em um para loop?
Além disso, o seguinte (sem aspas duplas) produz o mesmo resultado:

printf "param: %s\n" $@

    
por Jim 26.03.2018 / 13:36

1 resposta

17

O que está acontecendo aqui é que quando você passa printf mais argumentos do que os parâmetros de formatação posicional para ( %s e outras coisas), ele irá repetir o formato. E está repetindo em várias linhas porque você tem \n em sua string de formato. Não há nada de especial sobre $@ neste caso.

Por exemplo:

$ printf 'Foo: %s\n' bar baz
Foo: bar
Foo: baz

$ printf 'Foo: %s %s\n' bar baz
Foo: bar baz
    
por 26.03.2018 / 14:35