Pasar argumentos con espacios entre el script (bash)

93

Tengo los siguientes scripts de bash dos

ceniza:

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

b.sh:

#!/bin/bash
someApp $*

El binario someApp recibe $*como 2 argumentos ('Mi' y 'Argumento') en lugar de 1.

He probado varias cosas:

  • Ejecutar someApp solo b.shfunciona como se esperaba
  • Iterar + hacer eco de los argumentos en b.shfunciona como se esperaba
  • Usar en $@lugar de $*no hace la diferencia
John miedo
fuente
6
prueba someApp "$*"osomeApp "$@"
Russell Uhl
1
Sí, ¡funciona como un encanto!
John Fear

Respuestas:

147

$*, sin comillas, se expande a dos palabras. Necesita citarlo para que someAppreciba un solo argumento.

someApp "$*"

Es posible que desee usar $@en su lugar, por lo que someApprecibiría dos argumentos si llamara b.shcomo

b.sh 'My first' 'My second'

Con someApp "$*", someApprecibiría un único argumento My first My second. Con someApp "$@", someApprecibiría dos argumentos My firsty My second.

chepner
fuente
24
La clave que es fácil pasar por alto es que "$ @" debe ser citado, al parecer. $ @ no es suficiente.
miracle2k
1
@ miracle2k Correcto. Sin comillas $@y $*funcionan de manera idéntica.
chepner
2
@ Matt Eso es algo completamente diferente. "$ @" es especial porque cita cada argumento por separado. Puede resultar en más de un argumento así. "$ algo" son solo comillas alrededor de lo que $ algo se expande y siempre será un solo argumento.
Carlo Wood
La respuesta solo funciona para mí si la configuro IFS=$'\n'. No tengo idea de por qué.
Dominic M