2010-02-19 21 views
5

Jakie jest właściwe wcięcie dla skryptu bash? Jako małpa java/C++ rozmyślnie wciskam mój kod. Ale wydaje się, że nie wolno wciąć ten kod:Jakie jest właściwe wcięcie dla skryptów Bash?

#! /bin/bash 

if [ $# = 0 ] 
then 
     # there was no arguments => just do to standard output. 
     echo "there are no parameters" 
else 
cat << EOF 
========================================================== 
========================================================== 
========================================================== 
========================================================== 
DESCRIPTION: 

$1 
---------------------------------------------------------- 

EOF 
fi 

Kiedy wcięty to nie rozpoznaje EOF i jeśli tylko wcięcie na EOF (mylące) drukuje wcięte.

P: Jakie jest właściwe wcięcie dla skryptów Bash?

+0

większości języków programowania, które wyposażone HEREDOCs mają problemy ich wcięć. To naprawdę nie jest specyficzne dla basha. –

Odpowiedz

18

Z bash (przynajmniej 3.2) i ksh (nie wiadomo o innych) można wcięcia tu dokumentów przy użyciu <<-, a wiodące karty zostaną usunięte (nie spacje, tylko karty), np.

if [...]; then 
    cat <<-EOF 
     some text 
    EOF 
fi 
+2

Inną rzeczą, o której warto wiedzieć, jest to, że cytowanie separatora początkowego zapobiega ekspansji (parametr, podstawianie komend itd.) Dokumentu tutaj: 'foo << "EOF" 'i można je łączyć:' foo << - "EOF" '. Ten ostatni jest przydatny do komentowania bloków kodu (możesz użyć polecenia no-op ':' jako polecenia odbierającego lub pominąć je). Również przy użyciu '<< -' możesz wybrać wcięcie ogranicznika końcowego (lub dowolnej linii). –

+0

Zobacz mój komentarz do drugiej odpowiedzi, nie można wcięć markera końcowego tutaj dokumentu. – haridsv

+0

działa również w 'desce'. –

2

Nie jest to problem z wcięciem bash, jest to problem z plikiem tutaj. Etykieta określona po <<, tj. EOF musi pojawić się osobno w wierszu, bez poprzedzających lub kończących białych znaków.

W przypadku samego pliku tutaj jest on używany jako typowe, dołączone wcięcie.

+0

istnieje rozwiązanie ('<< -'), zobacz inne odpowiedzi –

-1

Mouviciel ma rację.

Możesz umieścić tekst pliku tutaj w oddzielnym pliku, jeśli chcesz zachować wcięcie. Jednak musiałbyś sam sobie poradzić z podstawieniem.

4

tak można "tiret", za pomocą <<- (patrz strona man bash tu dokumenty)

if [ $# = 0 ] 
then 
     # there was no arguments => just do to standard output. 
     echo "there are no parameters" 
else 
    cat <<-EOF 
    ========================================================== 
    ========================================================== 
    ========================================================== 
    ========================================================== 
    DESCRIPTION: 

    $1 
    ---------------------------------------------------------- 
    EOF 
fi 
+0

+1. Nie znałem tej funkcji! – mouviciel

+1

To jest trochę niepoprawne, nie można wciskać znacznika końca dokumentu tutaj. W rzeczywistości jest to mój największy problem z tymi dokumentami, że one tylko usuwają wiodące tabulatory (chciałbym 2 spacje jako wcięcia) i że nadal nie możesz wciskać końcowego znacznika. – haridsv

+1

@haridsv właściwie ty ** możesz ** wgniatać końcowy znacznik w 'GNU bash 4.3.11' i' dash 0.5.7' –

Powiązane problemy