Apa perintah yang berarti "tidak melakukan apa-apa" dalam sebuah kondisional di Bash?

180

Terkadang saat membuat persyaratan, saya memerlukan kode untuk tidak melakukan apa pun, misalnya, di sini, saya ingin Bash tidak melakukan apa pun ketika $alebih besar dari "10", cetak "1" jika $akurang dari "5", jika tidak, cetak "2":

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

Ini membuat kesalahan. Apakah ada perintah yang tidak akan melakukan apa pun dan juga tidak memperlambat skrip saya?

Desa
sumber

Jawaban:

340

Perintah no-op di shell adalah :(titik dua).

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

Dari manual bash :

:(titik dua)
Jangan melakukan apa pun selain memperluas argumen dan melakukan pengalihan. Status pengembalian adalah nol.

Barmar
sumber
3
@SaintHax Tidak, itu tidak berjalan true. Itu dibangun ke dalam shell, dan tidak melakukan apa-apa.
Barmar
1
itu adalah shell bawaan (Anda benar), ia mengembalikan true (status 0) seperti halnya benar, dan lebih sulit untuk dibaca. Bash adalah bahasa DevOps, dan jika :ditulis oleh seseorang di tim saya, saya minta mereka mengubahnya.
SaintHax
3
@SaintHax Jika seseorang digunakan truedalam konteks non-kondisional, saya minta mereka mengubahnya. if truebaik-baik saja, then truesepertinya salah.
Barmar
1
Tentu saja, Anda hanya dapat menulis ulang kode untuk menggunakan if ! condition; then do something; fibukan if condition; then :; else do something; fi.
Barmar
Saya setuju denganmu. Contoh ini dapat ditulis jika / elif / else menggunakan kondisi gabungan dan akan lebih baik.
SaintHax
38

Anda mungkin bisa menggunakan trueperintah:

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

Alternatif, dalam contoh kasus Anda (tetapi tidak harus di mana-mana) adalah memesan ulang jika / yang lain:

if [ "$a" -le 5 ]; then
    echo "1"
elif [ "$a" -lt 10 ]; then
    echo "2"
fi
Flimzy
sumber
8
Jika Anda tidak menguji hasilnya baik truedan falsesecara efektif tidak-ops sejauh menyangkut skrip, tetapi pada prinsipnya mereka bisa bercabang di beberapa shell yang menerima sintaks ini jadi mungkin :lebih baik.
dmckee --- ex-moderator kitten
3
Pertanyaan ini ditandai dengan bash. Dalam bash, truedan falsebuilt-in. Untuk kerang yang lebih tua, true, false, dan bahkan :mungkin perintah eksternal (meskipun Anda mungkin akan melihat yang terakhir hanya dalam sangat kerang tua).
Keith Thompson
6
Saya lebih suka :hanya karena lebih eksplisit apa tujuannya
Freedom_Ben
9

Meskipun saya tidak menjawab pertanyaan awal yang menyepakati perintah no-op, banyak (jika tidak sebagian besar) masalah ketika orang mungkin berpikir " di cabang ini saya tidak melakukan apa-apa " dapat dilewati dengan hanya menata ulang logika sehingga cabang ini menang tidak terjadi.

Saya mencoba memberikan aturan umum dengan menggunakan contoh OPs

jangan lakukan apa pun ketika $ a lebih besar dari "10", cetak "1" jika $ a kurang dari "5", jika tidak, cetak "2"

kita harus menghindari cabang di mana $amendapat lebih dari 10, sehingga $a < 10kondisi umum dapat diterapkan satu sama lain, mengikuti kondisi.

Secara umum, ketika Anda mengatakan melakukan apa-apa ketika X , maka ulang kata-kata sebagai menghindari cabang di mana X . Biasanya Anda dapat membuat penghindaran terjadi hanya dengan meniadakan X dan menerapkannya pada semua kondisi lainnya.

Jadi contoh OP dengan aturan yang diterapkan dapat direstrukturisasi sebagai:

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

Hanya variasi di atas, melampirkan segala sesuatu dalam $a < 10kondisi:

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

(Untuk contoh khusus ini, restrukturisasi @Flimzys tentu saja lebih baik, tetapi saya ingin memberikan aturan umum untuk semua orang yang mencari cara untuk tidak melakukan apa-apa.)

KeyNone
sumber
5
Salah satu alasan seseorang mungkin ingin memiliki larangan adalah ketika awalnya menyusun kode dengan gagasan bahwa seseorang akan menambahkan "tambahkan sesuatu di sini nanti" tanpa efek samping yang tidak disengaja. Misalnya jika seseorang meletakkan if-then-else-fi dalam .bashrc, jika Anda meletakkannya echo "put stuff here"akan merusak beberapa penggunaan non-login (mis. Scp rusak), dan hanya spasi / komentar yang menyebabkan kesalahan runtime.
Aphoid