Jak używasz linii kontynuacji basha?
Zdaję sobie sprawę, że możesz to zrobić:
echo "continuation \
lines"
>continuation lines
Jeśli jednak masz wcięty kod, to nie działa tak dobrze:
echo "continuation \
lines"
>continuation lines
bash
line
indentation
PyRulez
źródło
źródło
Odpowiedzi:
To jest to, czego możesz chcieć
Jeśli tworzy to dwa argumenty do powtórzenia, a chcesz tylko jeden, spójrzmy na konkatenację ciągów. W bash, umieszczenie dwóch ciągów obok siebie, konkatenacja:
Tak więc linia kontynuacji bez wcięcia jest jednym ze sposobów na podzielenie łańcucha:
Ale kiedy używane jest wcięcie:
Otrzymujesz dwa argumenty, ponieważ nie jest to już konkatenacja.
Jeśli chciałbyś, aby pojedynczy ciąg, który przecinał linie, jednocześnie wciskając wszystkie te spacje, ale nie uzyskując wszystkich tych spacji, możesz spróbować porzucić linię kontynuacji i użyć zmiennych:
Umożliwi to uzyskanie czystego wcięcia kodu kosztem dodatkowych zmiennych. Jeśli zmienisz zmienne lokalnymi, nie powinno być tak źle.
źródło
s="string no. 1" s+="string no. 2" s+=" string no. 3" echo "$s"
Tutaj dokumenty z
<<-HERE
terminatorem działają dobrze w przypadku wciętych wieloliniowych ciągów tekstowych. Spowoduje to usunięcie wszystkich wiodących zakładek z tego dokumentu. (Terminatory linii pozostaną jednak nadal.)Zobacz także http://ss64.com/bash/syntax-here.html
Jeśli chcesz zachować niektóre, ale nie wszystkie, początkowe spacje, możesz użyć czegoś takiego jak
a może użyj,
tr
aby pozbyć się nowych linii:(Druga linia ma zakładkę i spację z przodu; tabulator zostanie usunięty przez operatora myślnika przed terminatorem heredoc, podczas gdy spacja zostanie zachowana.)
Do owijania długich, złożonych ciągów w wielu liniach lubię
printf
:Działa również dobrze w kontekstach, w których chcesz osadzić nietrywialne fragmenty skryptu powłoki w innym języku, w którym składnia języka hosta nie pozwala na użycie dokumentu tutaj, na przykład w
Makefile
lubDockerfile
.źródło
printf
przykład teraz.)Możesz używać tablic bash
następnie
jest dodatkowa spacja, ponieważ (po instrukcji bash):
Więc ustaw,
IFS=''
aby pozbyć się dodatkowej przestrzeniźródło
W niektórych scenariuszach użycie zdolności konkatenacji Bash może być odpowiednie.
Przykład:
Z sekcji PARAMETRY strony Bash Man:
źródło
Natknąłem się na sytuację, w której musiałem wysłać długą wiadomość jako część argumentu polecenia i musiałem przestrzegać ograniczenia długości linii. Polecenia wyglądają mniej więcej tak:
Sposób, w jaki to rozwiązałem, to przeniesienie wiadomości jako dokumentu tutaj (jak sugerował @tripleee). Ale tutaj dokument staje się standardem, więc należy go ponownie przeczytać, poszedłem z poniższym podejściem:
Ma to tę zaletę, że
$message
może być użyte dokładnie jako stała łańcuchowa bez dodatkowych białych znaków lub znaków końca wiersza.Zauważ, że wszystkie powyższe wiersze wiadomości są poprzedzone znakiem
tab
, który jest usuwany w tym dokumencie (z powodu użycia<<-
). Na końcu nadal znajdują się podziały wierszy, które są następnie zastępowanedd
spacjami.Zauważ również, że jeśli nie usuniesz nowych linii, będą one wyglądały tak, jak
"$message"
są rozwinięte. W niektórych przypadkach możesz obejść ten problem, usuwając podwójne cudzysłowy$message
, ale wiadomość nie będzie już pojedynczym argumentem.źródło
Kontynuację linii można również osiągnąć poprzez sprytne użycie składni.
W przypadku
echo
:W przypadku vars:
Inne podejście w przypadku vars:
Voila!
źródło
Możesz po prostu oddzielić go znakami nowej linii (bez używania odwrotnego ukośnika) zgodnie z wymaganiami w ramach wcięcia w następujący sposób i po prostu usunąć nowe linie.
Przykład:
Lub jeśli jest to zmienna definicja nowej linii jest automatycznie konwertowana na spacje. Tak więc, pasek dodatkowych spacji tylko jeśli ma to zastosowanie.
źródło
Nie jest to dokładnie to, o co prosił użytkownik, ale innym sposobem na utworzenie długiego ciągu, który obejmuje wiele wierszy, jest jego przyrostowe tworzenie, na przykład:
Oczywiście w tym przypadku byłoby łatwiej zbudować go za jednym zamachem, ale ten styl może być bardzo lekki i zrozumiały, gdy mamy do czynienia z dłuższymi strunami.
źródło
Spróbuj z pojedynczymi cudzysłowami i połącz łańcuchy:
Uwaga: konkatenacja zawiera spacje.
źródło
echo
jeśli miałx=
, to pojawi się błąd:lines: command not found
.W zależności od tego, jakie rodzaje ryzyka zaakceptujesz oraz jak dobrze znasz dane i im ufasz, możesz użyć uproszczonej interpolacji zmiennych.
źródło
To prawdopodobnie nie jest odpowiedzią na Twoje pytanie, ale i tak może Ci się przydać.
Pierwsze polecenie tworzy skrypt, który jest wyświetlany przez drugie polecenie.
Trzecie polecenie sprawia, że skrypt jest wykonywalny.
Czwarte polecenie zawiera przykład użycia.
Zwróć uwagę, że jeśli naprawdę chcesz użyć tego skryptu, bardziej sensowne jest przeniesienie wykonywalnego skryptu do programu
~/bin
, aby znalazł się na Twojej ścieżce.Sprawdź dokumentację Pythona, aby uzyskać szczegółowe informacje o tym, jak
textwrap.dedent
działa.Jeśli użycie
$'...'
lub"$(...)"
jest dla Ciebie mylące, zadaj kolejne pytanie (jedno na konstrukcję), jeśli jeszcze takiego nie ma. Dobrze byłoby podać link do znalezionego / zadanego pytania, aby inne osoby miały odnośnik.źródło