2013-09-03 9 views
219

Jak podzielić polecenie na wiele linii w powłoce, gdy polecenie jest częścią instrukcji if?Jak mogę podzielić polecenie powłoki na wiele linii, używając instrukcji IF?

Chociaż to działa:

if ! fab --fabfile=.deploy/fabfile.py --forward-agent --disable-known-hosts deploy:$target; then rc=1                  
fi 

To nie działa:

# does not work: 
if ! fab --fabfile=.deploy/fabfile.py \ 
    --forward-agent \ 
    --disable-known-hosts deploy:$target; then 
    rc=1 
fi 

Zamiast cała komenda wykonanie, otrzymuję:

./script.sh: line 73: --forward-agent: command not found 

Co ważniejsze, czego brakuje z mojego rozumienia Bash, które pomoże mi zrozumieć te i podobne problemy w przyszłości?

+1

Jaki jest błąd? Mogę wykonać '$ if! cp -n log/server1.log \ >.; następnie echo bez kopii; fi' bez błędu, z znakiem nowej linii po '\' –

+11

Czy masz spacje za końcowym ukośnikiem odwrotnym '\'? Są dość trudne do zobaczenia. Jeśli tak, możesz chcieć, aby twój edytor usunął spacje końcowe lub uczynił je bardziej widocznymi. – msw

+4

Tak, było to spacje po końcowych ukośnikach odwrotnych. Całkowicie. Dziękuję Ci. –

Odpowiedz

324

Kontynuacja linii zakończy się niepowodzeniem, jeśli masz spacje (spacje lub znaki tabulacji) po odwrotnym ukośniku i przed znakiem nowej linii. Bez takiego spacji, twój przykład działa dobrze dla mnie:

$ cat test.sh 
if ! fab --fabfile=.deploy/fabfile.py \ 
    --forward-agent \ 
    --disable-known-hosts deploy:$target; then 
    echo failed 
else 
    echo succeeded 
fi 

$ alias fab=true; . ./test.sh 
succeeded 
$ alias fab=false; . ./test.sh 
failed 
+4

Mark, wiesz, musiałem mieć białe spacje. Jestem w stanie odtworzyć błąd tylko podczas dodawania spacji po '\' s. Na przykład, dodając jeden po pierwszym '\', otrzymuję './soundops: wiersz 73: --forward-agent: command not found'. Moje problemy polegały na tym, że nie rozumiałem tego błędu. Dlaczego posiadanie białych znaków powoduje ten błąd? Biała spacja + '\ n'" neguje "\" i ogranicza polecenie? –

+52

Ukośnik odwrotny przed nową linią zapobiega zakończeniu wiersza przez newline. Ale tak samo jak specjalne sekwencje specjalne, takie jak "\ n", działają tylko z tylnym ukośnikiem i n, backslash-newline działa tylko z niczym pomiędzy backslash i newline. –

+8

Hahaha wow, oczywiście, że ma sens. Nigdy tego nie widziałem. Otwieranie oczu, ale tak proste: to tylko ucieczka z linii nowej linii. Nienawidzę niewidzialnych postaci. Sprawiliby mi więcej sensu, gdyby wszyscy byli po prostu widoczni. Dziękuję Ci! –

19

FOR/Cygwin/etc użytkowników Windows:

Również upewnić się, że zakończenia linii są standardowe linia Unix karmi, czyli \n (LF) tylko . Posiadanie zakończeń linii Windows \r\n (CRLF) spowoduje ich przerwanie.

+0

Rozwiązuje to problem związany z tworzeniem skryptu w systemie Windows, a następnie używanie go w systemie Windows bash (np. Bash -c MyShellScript.sh, gdzie MyShellScript.sh został utworzony w edytorze systemu Windows).Musisz zapisać MyShellScript.sh w systemie UNIX, prawdopodobnie używając notatnika ++. – BSalita