2013-07-11 11 views
104

Czasami przy tworzeniu warunków, potrzebuję kodu, aby nic nie robić, np. Tutaj, chcę, aby BASH nic nie robił, gdy $a jest większy niż "10", drukuj "1", jeśli $a jest mniejszy niż "5", w przeciwnym razie wydrukuj "2":Co polecenie oznacza "nie robić nic" w warunkowej w BASH?

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

To powoduje błąd. Czy istnieje polecenie, które nic nie da i które nie spowolni mojego scenariusza?

Odpowiedz

207

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

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

Z bash manual:

: (dwukropek)
rób nic poza rozszerza argumenty i wykonywania przekierowań. Status powrotu wynosi zero.

+0

dla edukacji,: jest operatorem, który uruchamia "true". W takich przypadkach bardzo podoba mi się prawdziwe, ponieważ jest o wiele łatwiejsze do odczytania. – SaintHax

+1

@SaintHax Nie, nie działa "true". Jest wbudowany w powłokę i nic nie robi. – Barmar

+1

to jest wbudowana w powłokę (masz rację), zwraca true (status 0), podobnie jak true, i jest trudniejsza do odczytania. Bash to język DevOps, a jeśli ':' jest napisane przez kogoś z mojego zespołu, chciałbym, żeby to zmienili. – SaintHax

28

można prawdopodobnie wystarczy użyć polecenia true:

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

alternatywę w przykładowym przypadku (ale niekoniecznie wszędzie) jest ponownie zamówić if/else:

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

Jeśli nie przetestujesz wyniku, zarówno "true", jak i "false" są efektywnymi no-opami w odniesieniu do skryptu, ale w zasadzie mogą * rozwidlić * niektóre powłoki, które akceptują tę składnię, więc być może ':' jest lepsze. – dmckee

+2

Pytanie jest oznaczone jako bash. W bashu "true" i "false" są wbudowane. W przypadku starszych powłok, 'true',' false', a nawet ':' mogą być zewnętrznymi komendami (chociaż prawdopodobnie będziesz widział te ostatnie tylko w * bardzo * starych powłokach). –

+4

Wolę ':' tylko dlatego, że jest bardziej jednoznaczne, co jest intencją: –

9

Chociaż nie mam odpowiedzi na pierwotne pytanie concering polecenia no-op, wielu (jeśli nie większość) problemy, gdy może się wydawać „w tej branży mam nic nie robić” można ominąć przez proste restrukturyzacja logiki, aby ta gałąź się nie pojawiła.

staram się dać ogólną zasadę za pomocą przykładu OPS

zrobić nic, gdy $ a jest większe niż "10" print "1", jeśli $ a jest mniejsze niż "5", w przeciwnym razie, print „2”

musimy unikać oddział gdzie $a dostaje więcej niż 10 tak $a < 10 jak ogólny stan można zastosować do każdego innego, w następujących warunkach.

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

Więc przykład OP z reguły stosowane mogą być zrestrukturyzowane jako:

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

Wystarczy odmianą 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 

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

+0

Jednym z powodów, dla których ktoś może chcieć mieć opcję "no-op", jest początkowo konstruowanie kodu z myślą, że dodamy "dodaj coś tutaj później", nie powodując niezamierzonych efektów ubocznych. Na przykład. jeśli umieścisz if-then-else-fi w .bashrc, jeśli wstawisz "echo", wstaw tutaj coś "" to złamie niektóre z nielogicznych zastosowań (np. scp zostanie zerwane) i tylko białe znaki/komentarze powoduje błąd runtime. – Aphoid