Por que o --text = “$ @” apenas passa a primeira palavra?

8

Quando executo o script a seguir com alguns argumentos, como arg1 arg2 arg3 :

#!/bin/bash
zenity --entry --text="$@"

zenity cria um diálogo de entrada com este texto: "arg1" enquanto eu espero "arg1 arg2 arg3"

Se eu usar uma variável como o script a seguir, ele mostrará todos os argumentos para o texto da entrada.

#!/bin/bash
text="$@"
zenity --entry --text="$text"

Qual é a diferença entre esses scripts? Por que o primeiro substitui $@ apenas pelo primeiro argumento?

    
por Omid 26.10.2012 / 20:03

2 respostas

16

$@ expande para separar palavras (enquanto $* se expande para uma única palavra), como explicado no bash manual . Assim, quando você escreve

zenity --text="$@"

expande para

zenity --text="$1" "$2" "$3"

No entanto, as atribuições de variáveis de shell não são submetidas à divisão de palavras. Observe que a divisão de campo / palavra é omitida na lista de expansões para atribuições de variáveis no bash manual . Esse comportamento é consistente com a especificação POSIX . Então, quando você escreve

text="$@"

a variável text obtém todos os parâmetros posicionais como uma única palavra, equivalente a se você tivesse escrito text="$*" . De fato, essa é a razão pela qual as aspas duplas são frequentemente desnecessárias em atribuições de variáveis. Ambos

text=$@

e

text=$*

são perfeitamente seguros.

Então,

text=$@
zenity --option="$text"

expande "$text" para uma única palavra, e é por isso que isso funciona. Observe que --option="$@" é apenas um argumento normal para o comando zenity e não uma atribuição de variável de shell, e é por isso que a divisão de palavras ocorre aqui, mas não em text=$@ .

    
por 26.10.2012 / 21:45
7

$@ expande cada parâmetro em uma palavra separada, tornando-se

zenity --entry --text="arg1" "arg2" "arg3" # syntactically wrong for zenity

Use $* para expandi-lo em uma única palavra

zenity --entry --text="$*"

que se tornará

zenity --entry --text="arg1 arg2 arg3" # syntactically correct for zenity
    
por 26.10.2012 / 20:05