Jaki jest najlepszy sposób na emulację pętli do while w Bash?
Mógłbym sprawdzić warunek przed wejściem do while
pętli, a następnie kontynuować ponowne sprawdzanie warunku w pętli, ale to jest zduplikowany kod. Czy istnieje czystszy sposób?
Pseudo kod mojego skryptu:
while [ current_time <= $cutoff ]; do
check_if_file_present
#do other stuff
done
To nie działa, check_if_file_present
jeśli zostanie uruchomione po $cutoff
czasie, a zrobi to po chwili.
until
przełącznika?until
oceni również stan przed wykonaniem treści pętliOdpowiedzi:
Dwa proste rozwiązania:
Wykonaj kod raz przed pętlą while
Lub:
źródło
:
jest wbudowany, co odpowiada wbudowanytrue
. Oboje „nic nie robią pomyślnie”.true
jest rzeczywistym programem, ale:
jest wbudowany. Były po prostu wychodzi z0
(orazfalse
z1
) ten ostatni robi absolutnie nic. Możesz to sprawdzićwhich true
.:
można nadal używać zamiasttrue
w Bash. Wypróbuj zwhile :; do echo 1; done
.true
to nie jest wbudowane w Bash. Jest to program zwykle znajdujący się w/bin
.type true
w bash (z powrotem do bash 3.2) zwracatrue is a shell builtin
. To prawda, że/bin/true
to program; co nie jest prawdą w stosunku do prawdy,true
to nie jest wbudowana. (tl; dr: true to wbudowany bash ORAZ program)Umieść korpus pętli po
while
i przed testem. Rzeczywista treśćwhile
pętli nie powinna być opcją.Zamiast dwukropka możesz użyć,
continue
jeśli uznasz to za bardziej czytelne. Możesz także wstawić polecenie, które będzie uruchamiane tylko między iteracjami (nie przed pierwszą ani po ostatniej), takie jakecho "Retrying in five seconds"; sleep 5
. Lub wypisuj ograniczniki między wartościami:Zmieniłem test, aby używał podwójnych nawiasów, ponieważ wydaje się, że porównujesz liczby całkowite. W podwójnych nawiasach kwadratowych operatory porównania, takie jak,
<=
są leksykalne i dadzą zły wynik podczas porównywania na przykład 2 i 10. Te operatory nie działają w pojedynczych nawiasach kwadratowych.źródło
while { check_if_file_present; ((current_time<=cutoff)); }; do :; done
? To znaczy, czy polecenia wewnątrzwhile
warunku są skutecznie oddzielone średnikami, a nie np.&&
, I pogrupowane według{}
?&&
lub||
ponieważ to skutecznie czyni je częścią testu, który kontrolujewhile
. O ile nie używasz tej konstrukcji w wierszu poleceń, nie zrobiłbym tego jako jednowierszowy (w szczególności w skrypcie), ponieważ zamiar jest nieczytelny.while false; false; false; true; do echo here; break; done
wyjścia „tutaj”Możemy emulować pętlę do-while w Bash w
while [[condition]]; do true; done
następujący sposób:Dla przykładu. Oto moja implementacja uzyskiwania połączenia ssh w skrypcie bash:
To da wynik w kolejności, jak poniżej:
źródło