Przekazywanie argumentów ze spacjami między skryptem (bash)


94

Mam następujące bash dwa skrypty

popiół:

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

b.sh:

#!/bin/bash
someApp $*

Plik binarny someApp otrzymuje $*jako 2 argumenty („Mój” i „Argument”) zamiast 1.

Przetestowałem kilka rzeczy:

  • Uruchomienie someApp tylko przez b.shdziała zgodnie z oczekiwaniami
  • Iteruj + powtarzaj argumenty w b.shdziała zgodnie z oczekiwaniami
  • Używanie $@zamiast $*nie ma znaczenia

6
spróbuj someApp "$*"lubsomeApp "$@"
Russell Uhl

1
Yupp - działa jak urok!
John Fear

Odpowiedzi:


152

$*, bez cytowania, rozwija się do dwóch słów. Musisz go zacytować, aby someAppotrzymał pojedynczy argument.

someApp "$*"

Możliwe, że chcesz użyć $@zamiast tego, aby someAppotrzymać dwa argumenty, jeśli chcesz wywołać b.shas

b.sh 'My first' 'My second'

Z someApp "$*", someAppotrzyma pojedynczy argument My first My second. Z someApp "$@", someAppotrzyma dwa argumenty My firsti My second.


25
Wydaje się, że kluczem, który łatwo przeoczyć, jest to, że „$ @” musi być cytowane. $ @ to za mało.
miracle2k

1
@ miracle2k Prawidłowo. Bez cytowania $@i $*działają identycznie.
chepner

2
@Matt To jest coś zupełnie innego. „$ @” jest wyjątkowy, ponieważ cytuje każdy argument oddzielnie. Może to skutkować więcej niż jednym argumentem. „$ coś” to po prostu cudzysłów wokół tego, do czego $ coś się rozwija i zawsze będzie pojedynczym argumentem.
Carlo Wood

Odpowiedź działa dla mnie tylko wtedy, gdy ustawię IFS=$'\n'. Nie mam pojęcia dlaczego.
Dominic M
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.