Często widziałem ten konstrukt w skryptach i sam go używałem, ale niepokoi mnie to, że nie mogę go znaleźć w dokumentacji.
Przykład:
[ -f file1 ] &&
[ -f file2 ] &&
echo "Both files exist." ||
echo "One or the other file doesn't exist."
Można to również zrobić za pomocą ukośników odwrotnych przed znakami nowej linii, jak wspomniano w man bash
:
If a \<newline> pair appears, and the backslash is not
itself quoted, the \<newline> is treated as a line continuation (that
is, it is removed from the input stream and effectively ignored).
Przykład:
[ -f file1 ] && \
[ -f file2 ] && \
echo "Both files exist." || \
echo "One or the other file doesn't exist."
... ale to nie wydaje się konieczne. Pierwsza wersja powyżej działa nawet bez ukośników.
Gdzie mogę to znaleźć man bash
? (Czy ta bash
specyfikacja jest zgodna z POSIX?)
bash
shell-script
Dzika karta
źródło
źródło
;
,&
,(
i)
.names=( Rama Soma<newline> Sita Diya )
. Python wyraźnie je tutaj opisuje , ale wydaje się, że dokumentacja Bash nie.Odpowiedzi:
Znak nowej linii jest ignorowany w kilku kontekstach, w których występuje oczywiście niezakończone polecenie. Konteksty te obejmują po operatora sterującego (
&&
,||
,|
,&
,;
,;;
, ale nie!
).Nie widzę tego udokumentowanego w podręczniku bash.
W POSIX jest określony przez reguły gramatyczne . Gdziekolwiek reguły mają
linebreak
, możesz mieć zero lub więcej podziałów linii.źródło
|
na początku następnego wiersza? Pamiętaj, że powłoka jest również używana interaktywnie, nie tylko w skryptach, a gramatyka jest taka sama.this && this2 && that
jest w porządku, ale dlaelse
klauzuli użyłbym faktycznegoif then else fi
.)