Jakie polecenie oznacza „nic nie rób” w warunku w Bash?

180

Czasami podczas tworzenia warunków warunkowych kod nic nie robi, np. Chcę, aby Bash nic nie robił, gdy $ajest większy niż „10”, wypisuje „1”, jeśli $ajest mniejszy niż „5”, w przeciwnym razie wypisuje „2”:

if [ "$a" -ge 10 ]
then
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

To jest jednak błąd. Czy istnieje polecenie, które nic nie zrobi, a także nie spowolni mojego skryptu?

Wioska
źródło

Odpowiedzi:

340

Poleceniem no-op w powłoce jest :(dwukropek).

if [ "$a" -ge 10 ]
then
    :
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

Z instrukcji basha :

:(dwukropek)
Nie rób nic poza rozszerzaniem argumentów i wykonywaniem przekierowań. Status zwrotu wynosi zero.

Barmar
źródło
3
@SaintHax Nie, nie działa true. Jest wbudowany w powłokę i nic nie robi.
Barmar
1
jest wbudowana w powłokę (masz rację), zwraca prawdę (stan 0) tak jak prawda i jest trudniejsza do odczytania. Bash to język DevOps i jeśli :jest napisany przez kogoś z mojego zespołu, powinienem go zmienić.
SaintHax
3
@SaintHax Gdyby ktoś był używany truew kontekście bezwarunkowym, kazałbym mu to zmienić. if truejest w porządku, then truewydaje się źle.
Barmar
1
Oczywiście możesz po prostu przepisać kod, aby użyć if ! condition; then do something; fizamiast if condition; then :; else do something; fi.
Barmar
Zgadzam się z Tobą. Ten przykład mógłby zostać napisany if / elif / else przy użyciu warunków złożonych i byłby lepszy.
SaintHax
38

Prawdopodobnie możesz po prostu użyć truepolecenia:

if [ "$a" -ge 10 ]; then
    true
elif [ "$a" -le 5 ]; then
    echo "1"
else
    echo "2"
fi

Alternatywą w Twoim przykładzie (ale niekoniecznie wszędzie) jest ponowne zamówienie if / else:

if [ "$a" -le 5 ]; then
    echo "1"
elif [ "$a" -lt 10 ]; then
    echo "2"
fi
Flimzy
źródło
8
Jeśli nie przetestujesz obu wyników truei nie będziesz w stanie nic zrobić, falsejeśli chodzi o skrypt, ale w zasadzie mogą one mieć rozwidlenie w niektórych powłokach, które akceptują tę składnię, więc być może :jest lepiej.
dmckee --- kociak byłego moderatora.
3
Pytanie jest oznaczone tagiem bash. W bash truei falsesą wbudowane. Dla starszych muszli, true, false, a nawet :może być polecenia zewnętrzne (choć prawdopodobnie chcesz zobaczyć ten ostatni tylko w bardzo starych powłok).
Keith Thompson,
6
Wolę :po prostu dlatego, że jest to bardziej wyraźne, jaki jest cel
Freedom_Ben
9

Chociaż nie odpowiadam na pierwotne pytanie dotyczące polecenia no-op, wiele (jeśli nie większość) problemów, gdy ktoś może pomyśleć „ w tej gałęzi nie muszę nic robić ”, można ominąć, po prostu przebudowując logikę , aby ta gałąź wygrała nie występuje.

Postaram się podać ogólną zasadę na przykładzie PO

nic nie rób, gdy $ a jest większe niż "10", wypisz "1", jeśli $ a jest mniejsze niż "5", w przeciwnym razie wypisz "2"

musimy unikać gałęzi, w której $adostaje się więcej niż 10, aby $a < 10warunek ogólny można było zastosować do każdego kolejnego warunku.

W ogólnym ujęciu, kiedy mówisz zrobić nic gdy X , a następnie go przeformułować jak uniknąć oddział, gdzie X . Zwykle możesz sprawić, że unikanie się wydarzy, po prostu negując X i stosując go do wszystkich innych warunków.

Zatem przykład PO z zastosowaną regułą można przekształcić w następujący sposób:

if [ "$a" -lt 10 ] && [ "$a" -le 5 ]
then
    echo "1"
elif [ "$a" -lt 10 ]
then
    echo "2"
fi

Tylko odmiana powyższego, obejmująca wszystko w $a < 10stanie:

if [ "$a" -lt 10 ]
then
    if [ "$a" -le 5 ]
    then
        echo "1"
    else
        echo "2"
    fi
fi

(W tym konkretnym przykładzie restrukturyzacja @Flimzys jest z pewnością lepsza, ale chciałem podać ogólną zasadę dla wszystkich ludzi, którzy szukają sposobu na nic nie robić.)

KeyNone
źródło
5
Jednym z powodów, dla których ktoś może chcieć nie robić nic, jest początkowa struktura kodu z myślą, że ktoś doda „dodaj coś tutaj później” bez niezamierzonych efektów ubocznych. Np. Jeśli umieścisz if-then-else-fi w .bashrc, jeśli umieścisz echo "put stuff here"go, zepsuje to niektóre z zastosowań niezwiązanych z logowaniem (np. Scp zostanie zepsuty), a tylko białe spacje / komentarze powodują błąd w czasie wykonywania.
Aphoid