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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.