Jak mogę wyprowadzić wieloliniowy ciąg w Bash bez używania wielu wywołań echa, takich jak:
echo "usage: up [--level <n>| -n <levels>][--help][--version]"
echo
echo "Report bugs to: "
echo "up home page: "
Szukam przenośnego sposobu, aby to zrobić, używając tylko wbudowanych wersji Bash.
echo >&2 ...
--help
(które powinno przejść do standardowego wyjścia).printf
oparte na Gordon Davidson rozwiązanie. Pomimo tego, że znajduje się w cieniu podejść opartych naecho
lubcat
, wydaje się, że jest to mniej kłopotów. Wprawdzie składnia `printf 'reprezentuje trochę krzywą uczenia się, ale chciałbym poznać inne wady (? Kompatybilność, wydajność? ...)Odpowiedzi:
Tutaj dokumenty są często wykorzystywane do tego celu.
Są obsługiwane we wszystkich powłokach pochodnych Bourne'a, w tym we wszystkich wersjach Bash.
źródło
cat
nie jest wbudowany.read -d '' help <<- EOF ...
na tym, że przeczytałem ciąg multilinii w zmiennej, a następnie powtórzyłem wynik.lub możesz to zrobić:
źródło
Zainspirowany wnikliwymi odpowiedziami na tej stronie stworzyłem podejście mieszane, które uważam za najprostsze i bardziej elastyczne. Co myślisz?
Po pierwsze, definiuję użycie w zmiennej, co pozwala mi na ponowne użycie w różnych kontekstach. Format jest bardzo prosty, prawie WYSIWYG, bez potrzeby dodawania żadnych znaków kontrolnych. Wydaje mi się to dość przenośne (uruchomiłem to na MacOS i Ubuntu)
Następnie mogę po prostu użyć go jako
lub nawet lepiej, kiedy parsuję parametry, mogę po prostu echo tam w linijce:
źródło
echo "$__usage"
było dla mnie konieczne.echo $__usage
nie działał.Użyj
-e
opcji, aby wydrukować nowy znak wiersza ze znakiem\n
.Próbka (ale nie jestem pewien, czy jest dobry czy nie)
Zabawne jest to, że-e
opcja ta nie jest udokumentowana na stronie podręcznika MacOS ale nadal jest użyteczna. Jest to udokumentowane na stronie man Linuksa .źródło
echo
komendy dostarczonej przez system/bin/echo
, która w systemie Mac OS nie ma-e
opcji. kiedy używasz bash na tych systemach, jego wbudowaneecho
polecenie przejmuje kontrolę. Możesz to zobaczyć, wpisując/bin/echo whatever
i obserwując różnicę w zachowaniu. Aby wyświetlić dokumentację wbudowanego, wpiszhelp echo
./bin/echo
często różni się w zależności od systemu operacyjnego i różni się od wbudowanego Bashecho
.echo -e
nie jest przenośny - na przykład niektóre implementacje echa wypiszą „-e” jako część wyniku. Jeśli chcesz mieć przenośność, użyj printf. Na przykład robi to / bin / echo w OS X 10.7.4. IIRC echo wbudowane w bash również było dziwne pod 10.5.0, ale nie pamiętam już szczegółów.echo -e
ugryzł mnie wcześniej ... Zdecydowanie użyjprintf
lubcat
heredoc.<<-
Wariant tutaj docs są szczególnie dobre, bo można rozebrać prowadzące wcięcia na wyjściu, ale dla czytelności tiret w skrypciePonieważ zaleciłem
printf
w komentarzu, prawdopodobnie powinienem podać kilka przykładów jego użycia (chociaż w przypadku drukowania komunikatu o użytkowaniu chętniej skorzystam z odpowiedzi Dennisa lub Chrisa).printf
jest nieco bardziej skomplikowany w użyciu niżecho
. Pierwszym argumentem jest ciąg formatu, w którym znaki specjalne (jak\n
) są zawsze interpretowane; może również zawierać dyrektywy formatujące zaczynające się od%
, które kontrolują, gdzie i jak mają być uwzględnione dodatkowe argumenty. Oto dwa różne podejścia do używania go w komunikacie użytkowania:Po pierwsze, możesz dołączyć całą wiadomość do ciągu formatu:
Zauważ, że w przeciwieństwie do tego
echo
musisz wyraźnie dołączyć ostatni znak nowej linii. Ponadto, jeśli wiadomość zawiera jakieś%
znaki, należy je zapisać jako%%
. Jeśli chcesz dołączyć raport o błędzie i adresy strony głównej, można je dodać całkiem naturalnie:Po drugie, możesz po prostu użyć ciągu formatu, aby wydrukować każdy dodatkowy argument w osobnym wierszu:
Dzięki tej opcji dodanie raportu o błędzie i adresu strony głównej jest dość oczywiste:
źródło
Również z wciętym kodem źródłowym można użyć
<<-
(z końcowym myślnikiem), aby zignorować wiodące tabulatory (ale nie wiodące spacje). Na przykład to:Wyświetla wcięty tekst bez wiodących białych znaków:
źródło
Jeśli skorzystasz z rozwiązania @jorge i stwierdzisz, że wszystko jest w tym samym wierszu, upewnij się, że umieściłeś zmienną w cudzysłowie:
wypisze wszystko w jednym wierszu, podczas gdy
zachowa nowe linie.
źródło
cat <<EOF .... EOF