W odpowiedzi na to pytanie dotyczące komentarzy w skryptach powłoki wskazano, że :
jest to polecenie zerowe, które jawnie nic nie robi (ale nie powinno być używane do komentarzy).
Jaka byłaby użyteczność polecenia, które absolutnie nic nie robi?
shell
shell-script
DQdlM
źródło
źródło
:
to, że musi być wbudowane, atrue
nie jest, co ma wpływ na zakres zmiennychOdpowiedzi:
Zwykle używam
true
w pętlach; Myślę, że to bardziej jasne:Jedyne miejsce, które znalazłem, które
:
jest naprawdę przydatne, to instrukcje na wypadek, gdybyś chciał coś dopasować, ale nie chcesz nic robić. Na przykład:źródło
true
dla warunku,:
dla NOP.case a in a ) ;; esac
. Czy są jakieś powłoki, które tego nie akceptują?case ${var} in value);; *) do_something;; esac
jest do zaakceptowania.:
Komenda nie jest potrzebny do pustych przypadkach.Pierwotnie był używany do ustalenia, że był to program powłoki Bourne'a, w przeciwieństwie do programu skompilowanego w języku C. Było to przed shebangiem i wieloma językami skryptowymi (csh, perl). Nadal możesz uruchomić skrypt, zaczynając od
:
:Generalnie uruchamia skrypt przeciwko
$SHELL
(lub/bin/sh
).Od tego czasu głównym zastosowaniem jest ocena argumentów. Nadal używam:
ustawić wartość domyślną w skrypcie.
źródło
:
jest przydatny do pisania pętli, które muszą być zakończone od wewnątrz.Będzie to działać na zawsze, chyba że
break
alboexit
jest nazywany lub powłoka otrzyma sygnał obciążeniowy.źródło
while true; do ...; done
przekazuje intencje czytelnikowi niżwhile :; do ...; done
Jeśli potrzebujesz skryptu powłoki w instrukcji „chyba”, możesz albo użyć warunku „nie”, który może wyglądać głupio w przypadku niektórych testów, albo użyć „:” w klauzuli true, z prawdziwym kodem w false- klauzula.
„Egzotyczny warunek” może być czymś, czego nie chcesz negować, lub jest to o wiele wyraźniejsze, jeśli nie używasz „logiki negatywnej”.
źródło
autoconf
ponieważ o wiele łatwiej jest dodać domyślną wartość:
dla pustych gałęzi, niż dowiedzieć się, jak odwrócić ten warunek.!
z przodu[ some-exotic-condition ]
jest głupie, ale zbędne: else
po nim nie jest głupie.!
Znacznik neguje całego elementu rurowego poleceń.while ! grep ... ; do ... done
lubif ! [ ... ] ; then ... fi
. Jest to w zasadzie zewnętrzne względemtest/[]
składni. Zobacz: pubs.opengroup.org/onlinepubs/9699919799/utilities/…Użyłem tego oprócz znaku # do tymczasowego komentowania linii, w sytuacji, gdy komentowanie linii powoduje błąd składniowy, z powodu wady gramatyki powłoki polegającej na niedopuszczeniu pustej sekwencji poleceń :
Bez: mamy brakującą sekwencję poleceń, która jest błędem składni.
źródło
Przydają mi się dwa przypadki
:
:Domyślne przypisania zmiennych
Jest to wygodny sposób na zezwolenie użytkownikom skryptu powłoki na zastąpienie ustawienia bez edytowania skryptu. (Jednak argumenty wiersza polecenia są lepsze, ponieważ nie ryzykujesz nieoczekiwanym zachowaniem, jeśli użytkownik przypadkowo ma zmienną, której używasz w wyeksportowanym środowisku). Oto, w jaki sposób użytkownik zastąpi to ustawienie:
${VAR=value}
Składnia mówi do zestawuVAR
, abyvalue
jeśliVAR
nie jest już ustawiony, a następnie rozszerzyć do wartości zmiennej. Ponieważ nie zależy nam jeszcze na wartości zmiennej, jest ona przekazywana jako argument do polecenia no-op,:
aby ją wyrzucić.Mimo że polecenie
:
to nie działa, interpretacja jest wykonywana przez powłokę (nie:
polecenie!) Przed uruchomieniem:
polecenia, więc przypisanie zmiennej nadal występuje (jeśli dotyczy).Dopuszczalne byłoby również użycie
true
lub użycie innego polecenia:
, ale kod staje się trudniejszy do odczytania, ponieważ zamiar jest mniej jasny.Działa również następujący skrypt:
Ale powyższe jest znacznie trudniejsze do utrzymania. Jeśli
${VAR}
powyżej linii zostanie dodana linia używająca,printf
należy przenieść domyślne rozszerzenie przypisania. Jeśli programista zapomni przenieść to zadanie, zostanie wprowadzony błąd.Coś do umieszczenia w pustym bloku warunkowym
Ogólnie należy unikać pustych bloków warunkowych, ale czasem są one przydatne:
Niektórzy twierdzą, że posiadanie pustego prawdziwego
if
bloku może ułatwić odczytanie kodu niż negowanie testu. Na przykład:jest prawdopodobnie łatwiejszy do odczytania niż:
Jednak uważam, że istnieje kilka alternatywnych metod, które są lepsze niż pusty prawdziwy blok:
Umieść warunek w funkcji:
Umieść warunek w nawiasach klamrowych (lub nawiasach, ale nawiasy spawnują proces podpowłoki, a wszelkie zmiany dokonane w środowisku w podpowłoce nie będą widoczne poza podpowłoką) przed zanegowaniem:
Użyj
||
zamiastif
:Wolę to podejście, gdy reakcja jest prostą jednowarstwową, taką jak zapewnienie warunków:
źródło
W starej powłoce pre-bourne w starożytnych wersjach systemu UNIX
:
komenda pierwotnie była przeznaczona do określania etykiet dlagoto
(była to osobna komenda, która nakierowuje dane wejściowe do miejsca znalezienia etykiety, więc etykiety nie mogą być osobną składnią, że shell wie, że.if
był również osobnym poleceniem.) Wkrótce został użyty do komentarzy, zanim pojawiła się składnia komentarza (#
została użyta do cofania) i obecnie jest około kompatybilności.źródło
Oprócz używania go jako instrukcji, która nic nie robi, możesz go używać do komentowania pojedynczych instrukcji, zamieniając je w argumenty dla:.
źródło
: echo write this line > myfile
nadal utworzy pusty plik.:
jest nie odpowiedni mechanizm komentowania.