Passaggio di argomenti con spazi tra lo script (bash)


93

Ho i seguenti due script di bash

cenere:

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

b.sh:

#!/bin/bash
someApp $*

Il binario someApp riceve $*come 2 argomenti ("My" e "Argument") invece di 1.

Ho provato diverse cose:

  • L'esecuzione di alcune app solo tramite b.shfunziona come previsto
  • Itera + echeggia gli argomenti nelle b.shopere come previsto
  • Usare $@invece di $*non fa differenza

6
provare someApp "$*"osomeApp "$@"
Russell Uhl

1
Yupp - funziona come un incantesimo!
John Fear

Risposte:


147

$*, non quotato, si espande in due parole. Devi citarla in modo che someAppriceva un singolo argomento.

someApp "$*"

È possibile che tu voglia usare $@invece, in modo da someAppricevere due argomenti se dovessi chiamare b.shcome

b.sh 'My first' 'My second'

Con someApp "$*", someAppriceverebbe un singolo argomento My first My second. Con someApp "$@", someAppriceverà due argomenti My firste My second.


24
La chiave che è facile perdere è che "$ @" deve essere citato, a quanto pare. $ @ non è sufficiente.
miracle2k

1
@ miracle2k Corretto. Non quotato $@e$* funzionano in modo identico.
chepner

2
@ Matt Questo è qualcosa di completamente diverso. "$ @" è speciale in quanto cita ogni argomento separatamente. In questo modo può risultare in più di un argomento. "$ qualcosa" è solo virgolette attorno a qualsiasi cosa $ qualcosa si espanda e sarà sempre un singolo argomento.
Carlo Wood

La risposta funziona solo per me se imposto IFS=$'\n'. Non ho idea del perché.
Dominic M
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.