Jak powiedzieć bashowi, że linia jest kontynuowana w następnej linii
101
W skrypcie basha, który otrzymałem od innego programisty, niektóre linie przekroczyły 80 kolumn długości. Jaki znak lub przedmiot należy dodać do wiersza w celu wskazania, że wiersz jest kontynuowany w następnym wierszu?
dzięki. i jakie są zwykłe ograniczenia w kolumnach skryptu bash?
Otwórz drogę
bash nie ma interesującego limitu kolumn; dla jasności powinieneś spróbować ograniczyć do 70-80 znaków na kolumnę.
Habbie
9
@RyanM Lewy ukośnik musi być ostatnim znakiem przed końcem wiersza. Czy NA PEWNO nie ma żadnych spacji po \?
George,
9
@George Yeah. Nieco więcej błahostek wypluje błąd z ^M. Problem polega na tym, że skrypt został mi przekazany przez kogoś, kto używa systemu Windows. Szybko dos2unixto naprawiłem :)
RyanM
2
@George Twój komentarz właśnie mnie uratował, miałem spację po \ i nie mogłem dowiedzieć się, co jest nie tak. Twoje zdrowie!
ffledgling
37
Ogólnie rzecz biorąc, możesz użyć odwrotnego ukośnika na końcu linii, aby polecenie przechodziło do następnej linii. Istnieją jednak przypadki, w których polecenia są niejawnie kontynuowane, a mianowicie, gdy wiersz kończy się tokenem, który nie może zgodnie z prawem zakończyć polecenia. W takim przypadku powłoka wie, że nadchodzi więcej, i ukośnik odwrotny można pominąć. Kilka przykładów:
# In general
$ echo "foo" \>"bar"
foo bar# Pipes
$ echo foo |> cat
foo# && and ||
$ echo foo &&> echo bar
foo
bar
$ false ||> echo bar
bar
Inna, ale powiązana, jest ukryta kontynuacja wewnątrz cudzysłowów. W tym przypadku, bez odwrotnego ukośnika, po prostu dodajesz nową linię do ciągu.
$ x="foo
> bar"
$ echo "$x"
foo
bar
Za pomocą odwrotnego ukośnika ponownie dzielisz wiersz logiczny na wiele wierszy logicznych.
Czy istnieje formalna lista takich sytuacji, w których polecenie jest niejawnie kontynuowane w następnej linii? Wydaje mi się, że w pewnych okolicznościach mógłbym zostawić ukośnik odwrotny w ramach warunku [[- ]], ale nie w innych, i próbuję wymyślić zasady.
Menachem,
16
\wykonuje pracę. Odpowiedź @ Guillaume i komentarz @ George'a jasno odpowiadają na to pytanie. Tutaj wyjaśniam, dlaczego The backslash has to be the very last character before the end of line character.Rozważ to polecenie:
mysql -uroot \
-hlocalhost
Jeśli po nim jest spacja \, kontynuacja linii nie będzie działać. Powodem jest to, że \ usuwa specjalne znaczenie następnego znaku, którym jest spacja, a nie niewidoczny znak nowego wiersza. Znak nowego wiersza znajduje się po spacji, którego nie ma \w tym przykładzie.
Odpowiedzi:
Znak jest ukośnikiem odwrotnym
\
Z instrukcji bash :
źródło
^M
. Problem polega na tym, że skrypt został mi przekazany przez kogoś, kto używa systemu Windows. Szybkodos2unix
to naprawiłem :)Ogólnie rzecz biorąc, możesz użyć odwrotnego ukośnika na końcu linii, aby polecenie przechodziło do następnej linii. Istnieją jednak przypadki, w których polecenia są niejawnie kontynuowane, a mianowicie, gdy wiersz kończy się tokenem, który nie może zgodnie z prawem zakończyć polecenia. W takim przypadku powłoka wie, że nadchodzi więcej, i ukośnik odwrotny można pominąć. Kilka przykładów:
Inna, ale powiązana, jest ukryta kontynuacja wewnątrz cudzysłowów. W tym przypadku, bez odwrotnego ukośnika, po prostu dodajesz nową linię do ciągu.
Za pomocą odwrotnego ukośnika ponownie dzielisz wiersz logiczny na wiele wierszy logicznych.
źródło
[[
-]]
, ale nie w innych, i próbuję wymyślić zasady.\
wykonuje pracę. Odpowiedź @ Guillaume i komentarz @ George'a jasno odpowiadają na to pytanie. Tutaj wyjaśniam, dlaczegoThe backslash has to be the very last character before the end of line character.
Rozważ to polecenie:Jeśli po nim jest spacja
\
, kontynuacja linii nie będzie działać. Powodem jest to, że\
usuwa specjalne znaczenie następnego znaku, którym jest spacja, a nie niewidoczny znak nowego wiersza. Znak nowego wiersza znajduje się po spacji, którego nie ma\
w tym przykładzie.źródło