Panduan Pemula Untuk BASH - Kondisi dan Variabel

pengantar

Selamat datang di bagian ketiga "Panduan Pemula untuk BASH". Jika Anda melewatkan dua artikel sebelumnya maka Anda mungkin akan ingin tahu apa yang membuat panduan ini berbeda dengan panduan scripting BASH lainnya.

Panduan ini ditulis oleh seorang pemula yang lengkap untuk BASH dan sebagai pembaca yang Anda pelajari sewaktu saya belajar. Sementara saya seorang pemula untuk BASH saya berasal dari latar belakang pengembangan perangkat lunak meskipun sebagian besar hal yang saya tulis telah untuk platform Windows.

Anda dapat melihat dua panduan pertama dengan mengunjungi:

Jika Anda baru untuk BASH scripting, saya sarankan membaca dua panduan pertama sebelum melanjutkan dengan yang satu ini.

Dalam panduan ini, saya akan menyoroti cara menggunakan pernyataan bersyarat untuk menguji masukan pengguna dan untuk mengontrol cara kerja skrip.

Instal rsstail

Untuk mengikuti panduan ini, Anda perlu menginstal aplikasi baris perintah bernama rsstail yang digunakan untuk membaca umpan RSS .

Jika Anda menggunakan jenis distribusi berbasis Debian / Ubuntu / Mint berikut ini:

sudo apt-get install rsstail

Untuk Fedora / CentOS dll, ketik yang berikut:

yum instal rsstail

Untuk tipe openSUSE berikut ini:

zypper install rsstail

Pernyataan IF

Buka terminal dan buat file bernama rssget.sh dengan mengetik yang berikut:

sudo nano rssget.sh

Di dalam editor nano, masukkan teks berikut:

#! / bin / bash
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;

Simpan file dengan menekan CTRL dan O lalu keluar dengan menekan CTRL dan X.

Jalankan skrip dengan mengetik yang berikut:

sh rssget.sh

Skrip akan mengembalikan daftar judul dari umpan RSS linux.about.com.

Ini bukan skrip yang terlalu berguna karena hanya mengambil judul dari satu umpan RSS tetapi menyimpannya harus mengingat jalur ke umpan RSS Linux.about.com.

Buka skrip rssget.sh di nano lagi dan edit file untuk terlihat seperti berikut:

#! / bin / bash

jika [$ 1 = "verbose"]
kemudian
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
fi

Jalankan skripnya lagi dengan mengetik yang berikut:

sh rssget.sh verbose

Kali ini umpan RSS datang kembali dengan judul, tautan, dan deskripsi.

Mari kita analisis skripnya dengan sedikit detail:

The #! / Bin / bash muncul di setiap skrip yang kami tulis. Baris berikutnya pada dasarnya melihat pada parameter masukan pertama yang disediakan oleh pengguna dan membandingkannya dengan kata "verbose". Jika parameter input dan kata "verbose" cocok dengan garis antara lalu dan fi dijalankan.

Naskah di atas jelas cacat. Apa yang terjadi jika Anda tidak memberikan parameter input sama sekali? Jawabannya adalah Anda mendapatkan kesalahan di sepanjang garis operator yang tidak diharapkan.

Kelemahan utama lainnya adalah jika Anda tidak memberikan kata "verbose" maka tidak ada yang terjadi sama sekali. Idealnya jika Anda tidak memberikan kata secara lengkap, skrip akan mengembalikan daftar judul.

Gunakan nano lagi untuk mengedit file rssget.sh dan mengubah kode sebagai berikut:

#! / bin / bash

jika [$ 1 = "verbose"]
kemudian
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
lain
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi

Simpan file dan jalankan dengan mengetik yang berikut:

sh rssget.sh verbose

Daftar judul, deskripsi, dan tautan akan muncul. Sekarang jalankan lagi sebagai berikut:

judul sh rssget.sh

Kali ini hanya daftar judul yang muncul.

Bagian tambahan dari naskah ada di baris 4 dan memperkenalkan pernyataan yang lain . Pada dasarnya skrip sekarang mengatakan jika parameter pertama adalah kata "verbose", dapatkan deskripsi, tautan dan judul untuk umpan RSS tetapi jika parameter pertama adalah hal lain, dapatkan daftar judul.

Skrip telah sedikit membaik tetapi masih cacat. Jika Anda gagal memasukkan parameter, Anda masih akan mendapatkan kesalahan. Bahkan jika Anda memberikan parameter, hanya dengan mengatakan Anda tidak ingin verbose bukan berarti Anda hanya menginginkan judul. Anda mungkin baru saja salah mengeja salah misalnya atau Anda mungkin mengetik merpati yang tentu saja tidak berarti.

Sebelum kami mencoba dan menghapus masalah ini saya ingin menunjukkan kepada Anda satu lagi perintah yang sesuai dengan pernyataan IF.

Edit skrip rssget.sh Anda untuk melihat sebagai berikut:

#! / bin / bash

jika [$ 1 = "semua"]
kemudian
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "deskripsi"]
kemudian
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

lain
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi

Saya memutuskan untuk menyingkirkan kata verbose dan menggantinya dengan semua. Itu bukan bagian yang penting. Script di atas memperkenalkan elif yang merupakan cara singkat untuk mengatakan ELSE IF.

Sekarang naskah berfungsi sebagai berikut. Jika Anda menjalankan sh rssget.sh semua maka Anda mendapatkan deskripsi, tautan, dan judul. Jika bukan Anda hanya menjalankan deskripsi sh rssget.sh Anda hanya akan mendapatkan judul dan deskripsi. Jika Anda memberikan kata lain, Anda akan mendapatkan daftar judul.

Ini memperkenalkan cara cepat datang dengan daftar pernyataan kondisional. Cara lain untuk melakukan ELIF adalah dengan menggunakan apa yang dikenal sebagai pernyataan IF nested.

Berikut ini adalah contoh yang menunjukkan cara kerja pernyataan nested IF:

#! / bin / bash

jika [$ 2 = "aboutdotcom"]
kemudian
jika [$ 1 = "semua"]
kemudian
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "deskripsi"]
kemudian
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

lain
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
lain
jika [$ 1 = "semua"]
kemudian
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "deskripsi"]
kemudian
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
lain
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi

Jangan ragu untuk mengetik semua itu jika Anda suka atau salin dan tempel ke file rssget.sh Anda.

Skrip di atas memperkenalkan parameter ke-2 yang memungkinkan Anda memilih "about.com" atau "lxer.com" sebagai umpan RSS.

Untuk menjalankannya Anda mengetikkan hal-hal berikut:

sh rssget.sh semua tentangdotcom

atau

sh rssget.sh semua lxer

Tentu saja Anda dapat mengganti semua dengan deskripsi atau judul untuk memberikan deskripsi atau hanya judul saja.

Pada dasarnya kode di atas mengatakan jika parameter kedua adalah aboutdotcom maka lihatlah pernyataan kedua jika yang sama dari naskah sebelumnya yang lain jika parameter kedua adalah lxer kemudian lihat pada bagian dalam jika pernyataan lagi untuk memutuskan apakah akan menampilkan judul, deskripsi atau segalanya.

Skrip itu disediakan murni sebagai contoh pernyataan IF bersarang dan ada banyak hal yang salah dengan skrip itu, akan dibutuhkan artikel lain untuk menjelaskan semuanya. Masalah utamanya adalah bahwa itu tidak terukur.

Bayangkan Anda ingin menambahkan feed RSS lain seperti Everyday Linux User atau Linux Today? Skrip akan menjadi besar dan jika Anda memutuskan bahwa Anda ingin pernyataan JIKA dalam untuk mengubah Anda harus mengubahnya di banyak tempat.

Sementara ada waktu dan tempat untuk bersarang jika mereka harus digunakan dengan hemat. Biasanya ada cara untuk refactor kode Anda sehingga Anda tidak perlu IF bersarang sama sekali. Saya akan membahas topik ini di artikel mendatang.

Mari sekarang lihat memperbaiki masalah orang yang memasukkan parameter duff. Misalnya dalam skrip di atas jika pengguna memasukkan sesuatu selain "aboutdotcom" sebagai parameter ke-2, maka daftar artikel muncul dari umpan RSS dari LXER terlepas apakah pengguna memasukkan lxer atau tidak.

Selain itu, jika pengguna tidak memasukkan "semua" atau "deskripsi" sebagai parameter pertama, maka defaultnya adalah daftar judul yang mungkin atau tidak sesuai dengan yang diinginkan pengguna.

Lihatlah skrip berikut (atau salin dan tempel ke file rssget.sh Anda.

#! / bin / bash

jika [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
kemudian
jika [$ 1 = "semua"] || [$ 1 = "deskripsi"] || [$ 1 = "title"]
kemudian
jika [$ 2 = "aboutdotcom"]
kemudian

jika [$ 1 = "semua"]
kemudian
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "deskripsi"]
kemudian
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

lain
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
lain
jika [$ 1 = "semua"]
kemudian
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "deskripsi"]
kemudian
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
lain
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi

Hal pertama yang perlu diperhatikan adalah skrip sekarang semakin besar dan Anda dapat dengan cepat melihat bagaimana di luar kendali pernyataan IF bertumpuk dapat menjadi.

Bit yang penting dalam skrip ini adalah pernyataan IF || pernyataan KETIKA bagian pada baris 2 dan baris 4.

The || singkatan OR. Jadi garis jika [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] memeriksa apakah parameter ke-2 sama dengan "aboutdotcom" atau "lxer". Jika tidak maka pernyataan IF selesai karena tidak ada pernyataan lain untuk yang paling luar IF.

Demikian juga pada baris 4 baris jika [$ 1 = "semua"] || [$ 1 = "deskripsi"] || [$ 1 = "title"] memeriksa apakah parameter pertama sama dengan "semua" atau "deskripsi" atau "judul".

Sekarang jika pengguna menjalankan sh rssget.sh kentang keju tidak ada yang dikembalikan sedangkan sebelumnya mereka akan menerima daftar judul dari LXER.

Kebalikan dari || aku s &&. Operator && adalah singkatan AND.

Saya akan membuat skrip terlihat lebih seperti mimpi buruk tetapi itu membuat semua pemeriksaan penting untuk memastikan pengguna telah memberikan 2 parameter.

#! / bin / bash

jika [$ # -eq 2]
kemudian

jika [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
kemudian
jika [$ 1 = "semua"] || [$ 1 = "deskripsi"] || [$ 1 = "title"]
kemudian
jika [$ 2 = "aboutdotcom"]
kemudian

jika [$ 1 = "semua"]
kemudian
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "deskripsi"]
kemudian
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

lain
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
lain
jika [$ 1 = "semua"]
kemudian
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "deskripsi"]
kemudian
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
lain
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi
fi

Satu-satunya bit yang ekstra dalam skrip itu adalah pernyataan IF luar lainnya sebagai berikut: jika [$ # -eq 2] . Jika Anda membaca artikel tentang parameter input, Anda akan tahu bahwa $ # mengembalikan hitungan jumlah parameter input. The -eq berarti persamaan. Oleh karena itu pernyataan JIKA memeriksa bahwa pengguna memasukkan 2 parameter dan jika mereka tidak keluar begitu saja tanpa melakukan apa-apa. (Tidak terlalu ramah).

Saya sadar bahwa tutorial ini semakin besar. Tidak ada lagi yang bisa ditutup minggu ini, tetapi saya ingin membantu merapikan skrip sebelum kami selesai.

Perintah terakhir yang perlu Anda pelajari tentang pernyataan kondisional adalah pernyataan CASE.

#! / bin / bash


jika [$ # -eq 2]
kemudian
kasus $ 2 masuk
aboutdotcom)
kasus $ 1 masuk
semua)
rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml
;;
deskripsi)
rsstail -d -u z.about.com/6/o/m/linux_p2.xml
;;
judul)
rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml
;;
esac
;;
lxer)
kasus $ 1 masuk
semua)
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
;;
deskripsi)
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
;;
judul)
rsstail -u http://lxer.com/module/newswire/headlines.rss
;;
esac
;;
esac
fi

Pernyataan kasus adalah cara yang lebih baik untuk menulis JIKA LANJUTKAN JIKA TELAH JIKA LANJUTKAN JIKA.

Misalnya logika ini

JIKA buah = pisang
Lalu ini
BILA JIKA buah = jeruk
Lalu ini
LAIN JIKA buah = buah anggur
Lalu ini
BERAKHIR JIKA

dapat ditulis ulang sebagai:

buah dalam kasus
pisang)
melakukan hal ini
;;
jeruk)
melakukan hal ini
;;
anggur)
melakukan hal ini
;;
esac

Pada dasarnya barang pertama setelah kasus adalah hal yang akan Anda bandingkan (yaitu buah). Kemudian setiap item sebelum tanda kurung adalah hal yang Anda bandingkan dan jika cocok dengan garis yang mendahuluinya; akan berlari. Sebuah pernyataan kasus diakhiri dengan esac terbalik (yang merupakan kasus terbalik).

Dalam skrip rssget.sh, pernyataan kasus menghilangkan sebagian dari sarang yang mengerikan itu meskipun tidak benar-benar meningkatkannya.

Untuk benar-benar meningkatkan skrip, saya perlu memperkenalkan Anda kepada variabel.

Lihatlah kode berikut:

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
display = ""
url = ""

jika [$ # -lt 2] || [$ # -gt 2]
kemudian
echo "usage: rssget.sh [semua | deskripsi | judul] [aboutdotcom | lxer]";
keluar;
fi

kasus $ 1 masuk
semua)
display = "- d -l -u"
;;
deskripsi)
display = "- d -u"
;;
judul)
display = "- u"
;;
esac

kasus $ 2 masuk
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
esac
rsstail $ display $ url;

Suatu variabel didefinisikan dengan memberinya nama dan kemudian menetapkan nilai untuk itu. Dalam contoh di atas berikut ini adalah tugas variabel:

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
display = ""
url = ""

Script secara instan lebih mudah dikelola dengan menggunakan variabel. Misalnya setiap parameter ditangani secara terpisah sehingga tidak ada pernyataan IF bertumpuk.

Variabel tampilan sekarang diatur tergantung pada apakah Anda memilih semua, deskripsi atau judul dan variabel url diatur ke nilai variabel aboutdotcom atau nilai variabel lxer tergantung apakah Anda memilih aboutdotcom atau lxer.

Perintah rsstail sekarang hanya harus menggunakan nilai tampilan dan url untuk berjalan dengan benar.

Sementara variabel ditetapkan hanya dengan memberi mereka nama, untuk benar-benar menggunakannya, Anda harus menempatkan tanda $ di depan mereka. Dengan kata lain variabel = nilai set variabel ke nilai sedangkan $ variabel berarti memberi saya isi dari variabel.

Berikut ini adalah naskah terakhir untuk tutorial ini.

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
everydaylinuxuser = "http://feeds.feedburner.com/everydaylinux/WLlg"
linuxtoday = "http://feedproxy.google.com/linuxtoday/linux"
usage = "usage: rssget.sh [semua | deskripsi | judul] [lxer | aboutdotcom | everydaylinuxuser | linuxtoday]"
display = ""
url = ""

jika [$ # -lt 2] || [$ # -gt 2]
kemudian
echo $ usage;
keluar;
fi

kasus $ 1 masuk
semua)
display = "- d -l -u"
;;
deskripsi)
display = "- d -u"
;;
judul)
display = "- u"
;;
*)
echo $ usage;
keluar;
;;
esac

kasus $ 2 masuk
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
linuxtoday)
url = $ linuxtoday;
;;
everydaylinuxuser)
url = $ everydaylinuxuser;
;;
*)
echo $ usage;
keluar;
esac

rsstail $ display $ url;

Script di atas memperkenalkan lebih banyak RSS feed dan ada variabel penggunaan yang memberitahu pengguna bagaimana menggunakan skrip jika mereka tidak memasukkan 2 variabel atau mereka memasukkan opsi yang salah untuk variabel.

Ringkasan

Ini telah menjadi artikel epik dan mungkin sudah terlalu jauh terlalu cepat. Dalam panduan berikutnya saya akan menunjukkan kepada Anda semua opsi perbandingan untuk pernyataan IF dan masih banyak lagi yang perlu dibicarakan berkaitan dengan variabel.

Ada juga lebih banyak yang dapat dilakukan untuk memperbaiki skrip di atas dan ini akan dibahas di panduan mendatang saat kami menjelajahi loop, grep , dan ekspresi reguler.

Lihat How To (Gulir ke bawah melewati kategori untuk melihat daftar artikel) bagian dari l inux.about.com untuk menemukan panduan yang lebih berguna dari dual booting Windows dan Ubuntu untuk menyiapkan mesin virtual menggunakan kotak GNOME .