Co polecenie oznacza "nie robić nic" w warunkowym w Bash?

Czasami podczas tworzenia warunków potrzebuję kodu, aby nic nie robić, np. tutaj chcę, aby Bash nic nie robił, gdy $a jest większe niż "10", Drukuj "1", Jeśli $a jest mniejsze niż "5", w przeciwnym razie Drukuj"2":

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

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

Author: codeforester, 2013-07-11

3 answers

Komenda no-op w powłoce to : (dwukropek).

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

Z instrukcji bash :

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

 233
Author: Barmar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-26 19:31:34

Możesz prawdopodobnie użyć komendy true:

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
 28
Author: Flimzy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-11 01:26:19

Chociaż nie odpowiadam na pierwotne pytanie dotyczące komendy no-op, wiele (jeśli nie większość) problemów, kiedy można pomyśleć "w tej gałęzi nie muszę nic robić", można ominąć po prostu restrukturyzując logikę tak, aby ta gałąź nie wystąpiła.

Staram się podać ogólną zasadę używając przykładu OPs

Nie rób nic, Gdy $a jest większe niż "10", Drukuj" 1", Jeśli $a jest mniejsze niż" 5", w przeciwnym razie Drukuj"2"

Musimy unikać branch, gdzie $a ma więcej niż 10, więc $a < 10 jako warunek ogólny może być stosowany do każdego innego, następującego warunku.

Mówiąc ogólnie, kiedy mówisz nic nie rób, gdy X , przeformułuj to jako unikaj gałęzi, w której X . Zazwyczaj można dokonać unikania przez zwykłe negowanie X i zastosowanie go do wszystkich innych warunków.

Tak więc przykład OPs z zastosowaną regułą można przekształcić jako:

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

Tylko odmiana powyższego, załączając wszystko w stanie $a < 10:

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

(dla tego konkretnego przykładu @Flimzys jest na pewno lepszy, ale chciałem podać ogólną zasadę dla wszystkich ludzi szukających, jak nic nie robić.)

 8
Author: Basti M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:26