2012-06-10 13 views
134

Jak mogę wypisać multipline ciąg w bash bez korzystania z wielu połączeń echa tak:Jak wypisać ciąg wielowierszowy w Bash?

echo "usage: up [--level <n>| -n <levels>][--help][--version]" 
echo 
echo "Report bugs to: " 
echo "up home page: " 

Szukam przenośny sposób to zrobić, używając tylko poleceń wbudowanych bash.

EDIT

To rozwiązanie wymyśliłem, który jest odmianą odpowiedzi Dennisa.

read -d '' help <<- EOF 
    usage: up [--level <n>| -n <levels>][--help][--version] 

    Report bugs to: 
    up home page: 
EOF 

echo "$help" 
+4

Jeśli wyprowadzanie użytkowaniu w odpowiedzi na błędnym wywołaniem, normalnie można wysłać tę wiadomość do błędu standardowego zamiast standardowego wyjścia, z 'echo> i 2 ...' –

+2

@MarkReed Komunikat o użyciu jest wyprowadzany przez wpisanie '--help' (które powinno przejść do standardowego wyjścia). – helpermethod

+0

Dla innych osób, które przychodzą, więcej informacji o "tutaj dokumenty" jest dostępnych: http://www.tldp.org/LDP/abs/html/here-docs.html –

Odpowiedz

144

Tutaj dokumenty są często wykorzystywane do tego celu.

cat << EOF 
usage: up [--level <n>| -n <levels>][--help][--version] 

Report bugs to: 
up home page: 
EOF 

są obsługiwane we wszystkich powłok Bourne-pochodnych, w tym wszystkich wersji bash.

+3

Yup - ale 'cat' nie jest wbudowany. –

+4

@MarkReed: To prawda, ale jest to [zawsze dostępne] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cat.html) (z wyjątkiem możliwych sytuacji w nietypowych okolicznościach). –

+4

+1 Thx. Skończyło się na użyciu 'read -d '' help << - EOF ...', aby odczytać ciąg wielowierszowy w zmiennej, a następnie echo wyniku. – helpermethod

11

Zastosowanie -e opcja, a następnie można wydrukować znak nowego wiersza z \n w ciąg.

Sample (ale nie jestem pewien, czy to dobry, czy też nie)

Rzecz zabawne jest to, że -e opcja nie jest udokumentowana w MacOS's man page jednocześnie użyteczny. Jest to udokumentowane w man page of Linux.

+3

Te strony podręcznika dotyczą dostarczonego przez system polecenia 'echo','/bin/echo', które w systemie Mac OS nie ma opcji "-e". kiedy używasz basha w tych systemach, wbudowane jest wbudowane polecenie 'echo'. Możesz to zobaczyć, jawnie wpisując '/ bin/echo cokolwiek' i obserwując różnicę w zachowaniu. Aby zobaczyć dokumentację wbudowanego, wpisz 'help echo'. –

+0

'/ bin/echo' często różni się od jednego systemu operacyjnego do innego i różni się od wbudowanego' echa 'Basha. –

+0

@MarkReed: Spróbuję później, ale dzięki za informacje. +1. Po prostu zostawię tutaj swoją odpowiedź, ponieważ trwa tutaj bardzo dobra dyskusja. – nhahtdh

102

czy można to zrobić:

echo "usage: up [--level <n>| -n <levels>][--help][--version] 

Report bugs to: 
up home page: " 
+0

Czy jest to przenośne, tzn. Działa ze wszystkimi wersjami Bash? – helpermethod

+2

To zadziała co najmniej z powrotem na bash 2. –

+1

@OliverWeiler: Będzie działać nawet w powłokach Bourne'a, takich jak Dash i [Heirloom Bourne Shell] (http://heirloom.sourceforge.net/sh.html). –

16

Ponieważ poleciłem printf w komentarzu, powinienem podać kilka przykładów jego użycia (chociaż do wydrukowania komunikatu o używaniu, bardziej prawdopodobne jest użycie odpowiedzi Dennisa lub Chrisa). printf jest nieco bardziej skomplikowany w użyciu niż echo. Jej pierwszym argumentem jest ciąg formatujący, w którym interpretowane są wartości domyślne (jak); może również zawierać dyrektywy formatowania zaczynające się od %, które kontrolują, gdzie i jak dołączane są dodatkowe argumenty. Oto dwa różne podejścia do używania na komunikat wykorzystania:

Po pierwsze, można obejmować całą wiadomość w ciągu formatu:

printf "usage: up [--level <n>| -n <levels>][--help][--version]\n\nReport bugs to: \nup home page: \n" 

Należy zauważyć, że w przeciwieństwie do echo, musi zawierać ostateczną przełamane wyraźnie. Ponadto, jeśli wiadomość będzie zawierała dowolne znaki %, będą musiały być napisane jako %%.Jeśli chciał zawierać bugreport i stronę domową adresy mogą być dodawane zupełnie naturalnie:

printf "usage: up [--level <n>| -n <levels>][--help][--version]\n\nReport bugs to: %s\nup home page: %s\n" "$bugreport" "$homepage" 

Po drugie, można po prostu użyć ciąg formatu, aby wydrukować każdą dodatkowy argument w oddzielnym wierszu:

printf "%s\n" "usage: up [--level <n>| -n <levels>][--help][--version]" "" "Report bugs to: " "up home page: " 

Dzięki tej opcji dodanie bugreport i stronę domową adresów jest dość oczywista:

printf "%s\n" "usage: up [--level <n>| -n <levels>][--help][--version]" "" "Report bugs to: $bugreport" "up home page: $homepage" 
+0

+1 Nice! Nie wiedziałem, że możesz dostarczyć kilka argumentów do printf! – helpermethod

0

również z kodem źródłowym wcięciem można użyć < < - (ze znakiem kreskowania), aby zignorować wiodące karty lub spacje. Na przykład w ten sposób:

if [ some test ]; then 
    cat <<- xx 
     line1 
     line2 
xx 
fi 

Wyjścia wcięty tekst bez spacji wiodących:

line1 
line2 
Powiązane problemy