Bash Shell Script
Tags: linux, bash, ramadhanbersamaredhat, redhat
Published: 2024-03-17 07:21:40


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bbima4lc2fa0vz5bqrxf.png)

# Writing Simple Bash Scripts


**Membuat dan Menjalankan Bash Shell Script**
**Bash shell** adalah file yang dapat dieksekusi yang berisi daftar perintah, dan mungkin dikombinasikan dengan logika pemrograman untuk mengontrol pengambilan keputusan dalam keseluruhan tugas. Jika ditulis dengan baik, skrip shell merupakan alat baris perintah yang kuat, dan dapat dimanfaatkan oleh skrip lain.
Pengetahuan tentang skrip shell sangat penting dalam lingkungan perusahaan, di mana penggunaan skrip dapat meningkatkan efisiensi dan akurasi penyelesaian tugas rutin.


**Menentukan Penerjemah Perintah**
Baris pertama suatu script harus diawali dengan notasi **#!**, biasa disebut _sh-bang_ atau _she-bang_, nama kedua karakter tersebut, _sharp_ **“#”** dan _bang_ **“!”**. Notasi dua byte khusus ini menunjukkan skrip interpretatif; sintaks yang mengikuti notasi adalah nama file yang sepenuhnya memenuhi syarat untuk command interpreterkebutuhan yang benar untuk memproses baris skrip ini. Untuk file skrip yang menggunakan sintaks skrip Bash, baris pertama skrip shell dimulai sebagai berikut:

```
#!/bin/bash
```


**Menjalankan Bash Shell Script**
Ketika file script telah dibuat dan selesai, harus diberikan permissions executable(x) dengan perintah chmod, agar bisa dijalankan. Anda juga bisa mencantumkan file script tersebut pada directory Shell PATH agar anda dapat memanggil script anda hanya dengan nama filenya saja tanpa menuliskan path absolutnya. Gunakan command which diikuti nama file anda untuk melihat nama path dapat di jalankan.

```
[user@host ~]$ which hello
~/bin/hello
[user@host ~]$ echo $PATH
/home/user/.local/bin:/home/user/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

```


**Quoting Special Characters**
Sejumlah karakter dan kata memiliki arti khusus pada shell Bash. Namun, terkadang Anda ingin menggunakan karakter ini untuk nilai literalnya, bukan untuk arti khususnya. Untuk melakukan ini, gunakan salah satu dari tiga alat untuk menghapus (ataumelarikan diri) arti khusus: garis miring terbalik (\\), tanda kutip tunggal (''), atau tanda kutip ganda ("").

- Karakter **#** adalah sebuah komen yang tidak dijalankan oleh bash. Kecuali jika anda menambahkan karakter **/** sebelum **#** maka akan ditafsirkan/jalankan.

- Gunakan tanda kutip ganda **(" ")** untuk menekan ekspansi globbing dan shell, namun tetap mengizinkan substitusi perintah dan variabel. Substitusi variabel secara konseptual identik dengan substitusi perintah, tetapi dapat menggunakan sintaks kurung kurawal opsional. 

- Gunakan tanda kutip tunggal **(' ')** untuk menafsirkan seluruh teks secara harfiah. Selain menekan ekspansi globbing dan shell, kutipan mengarahkan shell untuk juga menekan substitusi perintah dan variabel. Tanda tanya **( ? )**adalah tanda meta-characteryang juga perlu dilindungi dari perluasan.


**Memberi Output dari Shell Script**
**echo** menampilkan teks arbitrer dengan meneruskan teks tersebut sebagai argumen ke perintah. Secara default, teks ditampilkan aktifkeluaran standar (STDOUT), tapi bisa juga ditujukan kekesalahan standar (STDERR) menggunakan pengalihan keluaran.



# Loops to Iterate Commands
Memungkinkan kemudahan bagi seorang administrasi untuk menggunakan beberapa comand yang berulang dalam waktu tertentu misalkan selama 10 menit dalam sehari.


**Memproses Item dari Baris Perintah**
Anda dapat menggunakan struktur seperti:
```
for VARIABLE in LIST; do
COMMAND VARIABLE
done
```
Loop memproses string yang disediakan di LIST secara ber urutan satu per satu dan dikeluarkan setelah memproses string terakhir dalam daftar. Setiap daftar disimpan pada VARIABLE untuk sementara saat foor loop mengeksekusi perintah yang dalam kontruksinya. Contoh:

```
[user@host ~]$ for HOST in host{1,2,3}; do echo $HOST; done	
```



**Kode Keluar dalam Skrip**
exit digunakan untuk menghentikan eksekusi script dan mengembalikan nilai keluaran (exit code). Merupakan kode keluaran yang akan dikembalikan oleh sistem operasi. Dapat berupa angka dari 0 – 255. Nila 0 berarti tidak terjadi eror/script berjalan sukses dan 1-255 menunjukan adanya eror dalam menjalankan script. Kode keluar ini disimpan dalam variabel ?.

```
[user@host bin]$ cat hello
#!/bin/bash
echo "Hello, world"
exit 0
[user@host bin]$ ./hello
Hello, world
[user@host bin]$ echo $?
0
```
**Testing Script Inputs**
**test** memriksa integritas. Perintah ini menghasilkan kode keluar yang disimpan sebagai nilai pada **$?**.
untuk menampilkan nilainya, tampilkan nilainya dengan echo **$?** Setelah perintah test. Nilai **0** adalah **True** dan **1** adalah **False**. Pengujian dapat menggunakan berbagai operator, misalnya lebih besar dari, lebih besari atau sama dengan, lebih kecil dari, lebih kecil atau sama dengan, atau sama dengan.

```
[user@host ~]$ test [ 1 -gt 0 ] ; echo $?
0
[user@host ~]$ test [ 0 -gt 1 ] ; echo $?
1
```

# Struktur Bersyarat
**Konstruksi if/then**
Jika suatu kondisi terpenuhi, maka satu atau lebih tindakan akan dieksekusi. Jika kondisi tertentu tidak terpenuhi, maka tidak ada tindakan yang dijalankan.

```
[user@host ~]$ if  [ $? -ne 0 ]; then
> sudo systemctl start psacct
> fi
```
**Konstruksi if/then/else**
Konstruknya **if/then** dapat diperluas lebih lanjut sehingga rangkaian tindakan yang berbeda dapat diambil tergantung pada apakah suatu kondisi terpenuhi. Hal ini dicapai dengan **if/then/else**.

```
[user@host ~]$ systemctl is-active psacct > /dev/null 2>&1
[user@host ~]$ if  [ $? -ne 0 ]; then
> sudo systemctl start psacct
> else
> sudo systemctl stop psacct
> fi
```
**Kontruksi  if/then/elif/then/else**
Untuk menguji lebih dari satu kondisi, mengeksekusi serangkaian tindakan yang berbeda ketika suatu kondisi terpenuhi.

```
[user@host ~]$ systemctl is-active mariadb > /dev/null 2>&1
MARIADB_ACTIVE=$?
[user@host ~]$ sudo systemctl is-active postgresql > /dev/null 2>&1
POSTGRESQL_ACTIVE=$?
[user@host ~]$ if  [ "$MARIADB_ACTIVE" -eq 0 ]; then
> mysql
> elif  [ "$POSTGRESQL_ACTIVE" -eq 0 ]; then
> psql
> else
> sqlite3
> fi
```
**Mencocokkan Teks dalam Output Perintah 
grep** adalah perintah yang digunakan untuk mencari teks dalam satu atau lebih file atau output dari perintah lain. Berikut adalah beberapa contoh penggunaan umum.
Contoh berikutnya menggunakan beragam file konfigurasi dan file log.
Ekspresi reguler peka huruf besar-kecil secara default. Gunakan **-i** opsi dengan **grep** untuk menjalankan pencarian yang tidak peka huruf besar-kecil. Contoh berikut mencari server root.

```
[user@host ~]$ cat /etc/httpd/conf/httpd.conf
...output omitted...
ServerRoot "/etc/httpd"

#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80
...output omitted...
```

```
[user@host ~]$ grep -i serverroot /etc/httpd/conf/httpd.conf
# with "/", the value of ServerRoot is prepended -- so 'log/access_log'
# with ServerRoot set to '/www' will be interpreted by the
# ServerRoot: The top of the directory tree under which the server's
# ServerRoot at a non-local disk, be sure to specify a local disk on the
# same ServerRoot for multiple httpd daemons, you will need to change at
ServerRoot "/etc/httpd"
```