2011-11-07 17 views
5

Muszę napisać skrypt, który generuje i wykonuje polecenie ze zmienną liczbą argumentów zawierających nazwy plików. Te nazwy plików mogą zawierać spacje i wszystko musi działać poprawnie bez spacji.Wykonywanie dynamicznie utworzonego polecenia ze spacjami w skrypcie powłoki

Na przykład ten generowany polecenie może wyglądać następująco:

curl --data-urlencode "[email protected]/tmp/some folder/data.txt" http://www.someurl.com 

Jeśli używam zakodowanego polecenia i wykonać go wszystko działa dobrze, i bez spacji. Jeśli jednak utworzę tekst polecenia w zmiennej łańcuchowej i wykonam zawartość ciągu, wydaje się, że polecenie nie bierze pod uwagę cudzysłowów, używając tylko pierwszej części pliku:

Skrypt (uproszczony, po prostu wyobraź sobie łańcuch polecenia jest tworzony za pomocą skomplikowanych zasad):

#!/bin/sh 
#prepare 
command="curl --data-urlencode \"[email protected]/tmp/some folder/data.txt\" www.someurl.com" 
#execute 
$command 

wyniki:

$ ./test.sh 
Warning: Couldn't read data from file ""[email protected]/tmp/some", this makes an 
Warning: empty POST. 
curl: (6) Couldn't resolve host 'folder' 

próbowałem różnych rzeczy, przełączanie cytaty stylu, przy użyciu rzeczy jak exec, ale could'nt uzyskać to do pracy .

Każda pomoc będzie mile widziane

Dzięki

UWAGA: Dodam wszystko to badanie odbywa się na Cygwin. Może to być ważne w odniesieniu do składni ścieżki.

+0

Spróbuj zastąpić przestrzeń "\" – spicavigo

+0

@spicavigo Próbowałem już bez rezultatu:/ – Shtong

+0

Można zamienić niektóre dbl-quotes dla pojedynczych cudzysłowów ?, tj. command = "curl --data-urlencode" param_value @/tmp/some folder/data.txt 'www.someurl.com "... Powodzenia! – shellter

Odpowiedz

0

Czy próbowałeś:

command='curl --data-urlencode "[email protected]/tmp/some\ folder/data.txt" www.someurl.com' 
+0

Zrobiłem, ale przykro mi, te same wyniki! – Shtong

+0

@Shtong: Zapomniałem usunąć ucieczkę z drugiego cudzysłowu. Zmieniono to teraz w moim kodzie. – flesk

+0

Och, nie widziałem twojego błędu, ale z błędem lub bez niego błąd jest taki sam :) – Shtong

4

Należy użyć eval:

eval "$command" 
+0

Bez powodzenia. Polecenie nie działa, ale dlatego, że szuka zawijania w bieżącym katalogu, a nie w katalogu bin. (mówi/home/Shtong/curl nie istnieje) – Shtong

+0

Działa jako urok dla mnie =) –

Powiązane problemy