Passando argumentos com espaços entre o script (bash)

92

Eu tenho o seguinte bash dois scripts

cinza:

#!/bin/bash
./b.sh 'My Argument'

b.sh:

#!/bin/bash
someApp $*

O binário someApp recebe $*2 argumentos ('Meu' e 'Argumento') em vez de 1.

Eu testei várias coisas:

  • Executar someApp apenas b.shfunciona conforme o esperado
  • Iterar + repetir os argumentos nas b.shobras conforme o esperado
  • Usar em $@vez de $*não faz diferença
John Fear
fonte
6
tente someApp "$*"ousomeApp "$@"
Russell Uhl
1
Yupp - funciona como um encanto!
John Fear

Respostas:

146

$*, sem aspas, se expande para duas palavras. Você precisa citá-lo para que someAppreceba um único argumento.

someApp "$*"

É possível que você queira usar em $@vez disso, de modo que someAppreceberia dois argumentos se você chamasse b.shcomo

b.sh 'My first' 'My second'

Com someApp "$*", someAppreceberia um único argumento My first My second. Com someApp "$@", someAppreceberia dois argumentos, My firste My second.

chepner
fonte
24
A chave que é fácil perder é que "$ @" precisa ser citado, ao que parece. $ @ não é suficiente.
miracle2k
1
@ miracle2k Correto. Não citados $@e $*funcionam de forma idêntica.
chepner de
2
@Matt Isso é algo totalmente diferente. "$ @" é especial porque cita cada argumento separadamente. Isso pode resultar em mais de um argumento. "$ something" é apenas aspas em torno de qualquer coisa que $ something expande e sempre será um único argumento.
Carlo Wood
A resposta só funciona para mim se eu definir IFS=$'\n'. Não faço ideia do porquê.
Dominic M