{"componentChunkName":"component---src-templates-resource-template-js","path":"/resources/try-bash","result":{"data":{"site":{"siteMetadata":{"title":"#COCONUT - Computer Club"}},"markdownRemark":{"html":"<p>Halo semuanya!</p>\n<p>Artikel ini membahas bahasa Bash yang sering dipakai di pekerjaan sehari-hari. Banyak tugas melibatkan CLI (Command Line Interface) secara intensif, jadi ini kesempatan untuk berbagi perintah-perintah Bash yang paling sering digunakan.</p>\n<p>Yuk langsung mulai!</p>\n<hr>\n<p><img src=\"/assets/resources/try-bash/bash-logo.jpg\" alt=\"bash logo\">\n<em>Ref: <a href=\"https://itsfoss.com/bash-5-release/\">https://itsfoss.com/bash-5-release/</a></em></p>\n<h2>Apa itu Bash</h2>\n<p>Bash adalah salah satu shell script yang tersedia di sistem operasi UNIX. Beberapa shell lain di antaranya cmd dan powershell yang berjalan di Windows. Kita tidak perlu menginstal program apa pun untuk menjalankan Bash karena sudah terpasang bawaan.</p>\n<hr>\n<h2>Bagian: Path</h2>\n<p>Di Unix, <code class=\"language-text\">~</code> menunjukkan root path, sedangkan <code class=\"language-text\">.</code> adalah direktori saat ini dan <code class=\"language-text\">..</code> adalah direktori induk (parent).</p>\n<p>Untuk melihat nilai path saat ini, gunakan <code class=\"language-text\">pwd</code>. <code class=\"language-text\">ls</code> untuk menampilkan daftar file dan folder di path saat ini. Dan <code class=\"language-text\">cd</code> untuk berpindah direktori.</p>\n<ul>\n<li><code class=\"language-text\">~</code>\nroot path</li>\n<li><code class=\"language-text\">.</code>\ndirektori saat ini</li>\n<li><code class=\"language-text\">..</code>\ndirektori induk</li>\n<li><code class=\"language-text\">pwd</code>: print working directory's name\nnilai path saat ini</li>\n<li><code class=\"language-text\">ls</code>: list\ndaftar file dan folder di path saat ini</li>\n<li><code class=\"language-text\">cd</code>: change directory\nberpindah direktori</li>\n</ul>\n<p><img src=\"/assets/resources/try-bash/ls.png\" alt=\"bash path\"></p>\n<p>Seperti contoh di atas, <code class=\"language-text\">ls</code> menampilkan file dan folder di path saat ini. Selain itu, <code class=\"language-text\">ls -la</code> (list – format <strong>l</strong>ong &#x26; <strong>a</strong>ll) menampilkan detail seperti permissions, nama pemilik, tanggal terakhir diubah, dan sebagainya dari setiap file/folder.</p>\n<p><code class=\"language-text\">pwd</code> menampilkan nilai path saat ini dan kita bisa berpindah direktori menggunakan <code class=\"language-text\">cd</code> dengan direktori tujuan. <code class=\"language-text\">cd ~</code> berarti pindah ke root directory (<code class=\"language-text\">/root</code>).</p>\n<hr>\n<h2>Bagian: Mengelola file/folder</h2>\n<p>Membuat direktori baru dengan <code class=\"language-text\">mkdir</code> atau file kosong baru dengan <code class=\"language-text\">touch</code>. Ingin menghapus file? Gunakan <code class=\"language-text\">rm</code>, atau <code class=\"language-text\">rm -r</code> jika itu folder.</p>\n<p><code class=\"language-text\">cp</code> untuk menyalin file/folder, dan <code class=\"language-text\">mv</code> untuk memindahkan atau mengganti namanya.</p>\n<ul>\n<li><code class=\"language-text\">rm</code>: remove\nmenghapus file, untuk folder tambahkan <code class=\"language-text\">-r</code>.</li>\n<li><code class=\"language-text\">mkdir</code>: make directory\nmembuat folder baru</li>\n<li><code class=\"language-text\">mv</code>: move\nmemindahkan atau mengganti nama file/folder</li>\n<li><code class=\"language-text\">cp</code>: copy\nmenyalin file/folder</li>\n<li><code class=\"language-text\">touch</code>\nmembuat file kosong</li>\n</ul>\n<p><img src=\"/assets/resources/try-bash/pwd.png\" alt=\"bash file management\"></p>\n<p>Saya membuat folder baru menggunakan <code class=\"language-text\">mkdir test01</code>. Lalu masuk ke dalamnya dengan <code class=\"language-text\">cd test01</code>, kemudian membuat file kosong dengan <code class=\"language-text\">touch test01_a.txt</code>. Setelah itu, menyalinnya menjadi file baru dengan <code class=\"language-text\">cp test01_a.txt test01_b.txt</code>.</p>\n<p>Di dalam folder \"test01\", saya membuat folder baru bernama \"test02\", lalu memindahkan \"test01<em>b.txt\" menggunakan `mv test01</em>b.txt test02/`. Path \"test01<em>b.txt\" berubah menjadi \"test02/test01</em>b.txt\".</p>\n<p>Untuk mengganti nama, kita harus menyebutkan nama file setelah memindahkannya, misalnya <code class=\"language-text\">mv test01_b.txt test02/test02_b.txt</code>.</p>\n<hr>\n<h2>Bagian: Permissions</h2>\n<p>Kita perlu mengubah permissions file, bisa diterapkan dengan <code class=\"language-text\">chmod</code>, sedangkan <code class=\"language-text\">chown</code> untuk mengganti pemilik.</p>\n<p>Untuk beberapa file yang membutuhkan hak akses lebih tinggi, <code class=\"language-text\">sudo</code> akan mengeksekusinya. Dan <code class=\"language-text\">su</code> untuk berganti pengguna di sistem.</p>\n<ul>\n<li><code class=\"language-text\">chmod</code>: <strong>ch</strong>ange <strong>mod</strong>e\nmengubah permissions file/folder</li>\n<li><code class=\"language-text\">chown</code>: <strong>ch</strong>ange <strong>own</strong>ership\nmengubah pemilik file/folder</li>\n<li><code class=\"language-text\">sudo</code>: <strong>su</strong>peruser <strong>do</strong>\nmengeksekusi perintah dengan hak akses lebih tinggi</li>\n<li><code class=\"language-text\">su</code>: <strong>s</strong>witch <strong>u</strong>ser\nberganti pengguna</li>\n</ul>\n<p><img src=\"/assets/resources/try-bash/chmod.png\" alt=\"bash permissions\"></p>\n<p>Seperti gambar di atas, <code class=\"language-text\">ls -la</code> pada file \"test01_a.txt\" menampilkan permissions sebagai berikut:</p>\n<p><img src=\"/assets/resources/try-bash/chmod-EN.drawio.png\" alt=\"permissions matrix\"></p>\n<div class=\"gatsby-highlight\" data-language=\"sh\"><pre class=\"language-sh\"><code class=\"language-sh\">ls -la\n-rw-r--r –  1 root  root    0 Nov 10 14:27 test01_a.txt\n# (-)rw-r--r – ==&gt; text01_a.txt adalah sebuah file\n# -(rw-)r--r – ==&gt; OWNER bernama &quot;root&quot; bisa membaca atau menulis file tetapi tidak bisa mengeksekusinya\n# -rw-(r--)r – ==&gt; GROUP bernama &quot;root&quot; bisa membaca tetapi tidak bisa menulis atau mengeksekusinya\n# -rw-r--(r--) ==&gt; OTHERS bisa membaca tetapi tidak bisa menulis atau mengeksekusinya</code></pre></div>\n<p><code class=\"language-text\">chmod +x</code> akan menambahkan hak eksekusi file untuk semua (OWNER, GROUP, OTHERS). Perintah itu mengubah permissions menjadi <code class=\"language-text\">-rwxr-xr-x</code>. Dan saya menggunakan <code class=\"language-text\">chown -R</code> (Recursive ke subfolder) untuk mengubah OWNER dari root menjadi tester untuk dirinya dan subfolder-subfoldernya.</p>\n<p>Terakhir, berganti pengguna ke tester dengan <code class=\"language-text\">su tester</code>.</p>\n<hr>\n<h2>Bagian: Operator</h2>\n<ul>\n<li><code class=\"language-text\">|</code> (pipe)\nEksekusi berurutan. Perintah kiri harus selesai dieksekusi dulu, baru perintah kanan dijalankan. Hasilnya berasal dari perintah kanan.</li>\n<li><code class=\"language-text\">&amp;</code> (ampersand)\nEksekusi paralel. Perintah di kedua sisi operator ini dijalankan bersamaan. Hasilnya dari keduanya tanpa urutan tertentu.</li>\n<li><code class=\"language-text\">||</code> (logical OR)\nEksekusi alternatif. Program dianggap sukses jika SALAH SATU perintah berhasil. Hasilnya dari perintah pertama yang berhasil.</li>\n<li><code class=\"language-text\">&amp;&amp;</code> (logical AND)\nEksekusi alternatif. Program dianggap sukses jika SEMUA perintah berhasil. Hasilnya dari semua perintah yang berhasil.</li>\n</ul>\n<p><img src=\"/assets/resources/try-bash/operator.png\" alt=\"bash operator\"></p>\n<p>Pertama, <code class=\"language-text\">echo \"a\" | echo \"b\"</code>, perintah kiri selesai lalu perintah kanan selesai. Hasilnya dari yang kanan yaitu \"b\".</p>\n<p>Kedua, <code class=\"language-text\">echo \"a\" &amp; echo \"b\"</code>, keduanya dieksekusi bersamaan dan yang kanan selesai lebih dulu. Hasilnya \"b\" lalu \"a\".</p>\n<p>Ketiga, <code class=\"language-text\">echo \"a\" || echo \"b\"</code>, perintah kiri berhasil dieksekusi dan hasilnya \"a\". Yang kanan tidak ikut dieksekusi. Program sukses.</p>\n<p>Terakhir, <code class=\"language-text\">echo \"a\" &amp;&amp; echo \"b\"</code>, perintah kiri berhasil lalu yang kanan juga. Hasilnya \"a\" lalu \"b\". Program sukses.</p>\n<hr>\n<h2>Bagian: String</h2>\n<p>Kita memakai perintah <code class=\"language-text\">echo</code> untuk menampilkan string atau nilai, dan <code class=\"language-text\">cat</code> untuk membaca file.</p>\n<p>Ada banyak perintah untuk memproses string. Berikut contoh perintah yang sering digunakan:</p>\n<ul>\n<li><code class=\"language-text\">echo</code>\nmenampilkan string atau nilai</li>\n<li><code class=\"language-text\">cat</code>: con<strong>cat</strong>enate\nmembaca isi file</li>\n<li><code class=\"language-text\">sed</code>: <strong>s</strong>tream <strong>ed</strong>itor\nmengganti string di dalam string lain</li>\n<li><code class=\"language-text\">grep</code>: <strong>g</strong>lobal search – <strong>r</strong>egular <strong>e</strong>xpression – <strong>p</strong>rint\nmencari dan menampilkan string di dalam string dengan regular expression</li>\n<li><code class=\"language-text\">cut</code>\nmengambil substring</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"sh\"><pre class=\"language-sh\"><code class=\"language-sh\">echo &quot;start&quot;\ncat sample_back.sh\necho &quot;a dog wags its tail&quot; | sed -e &quot;s/dog/cat/g&quot;\necho &quot;a fish swims in a jar&quot; | cut -c 1-5\necho &quot;my telephone number is 1234&quot; | grep -o &quot;[0-9]*&quot;</code></pre></div>\n<p><img src=\"/assets/resources/try-bash/sed.png\" alt=\"bash string\"></p>\n<p>Saya telah membuat file bernama sample_back.sh berisi teks \"this is a sample file for reading\".</p>\n<p>Dan file lain bernama sample_front.sh berisi perintah-perintah berikut:</p>\n<ul>\n<li><code class=\"language-text\">echo \"start\"</code>. Akan menampilkan \"start\"</li>\n<li><code class=\"language-text\">cat sample_back.sh</code>. Membaca file sample_back.sh dan mendapatkan kalimat yang sama yaitu \"this is a sample file for reading\".</li>\n<li>Berikutnya, <code class=\"language-text\">sed -e \"s/dog/cat/g\"</code> mengubah kata \"dog\" menjadi \"cat\" dan menghasilkan kalimat akhir \"a cat wags its tail\".</li>\n<li><code class=\"language-text\">cut -c 1-5</code> memotong semua huruf (termasuk spasi dan karakter khusus lainnya) antara posisi 1-5 dari kalimat asli. Hasilnya \"a fis\".</li>\n<li>Terakhir, <code class=\"language-text\">grep -o \"[0-9]*\"</code> mengekstrak hanya angka dari \"my telephone number is 1234\" dan menghasilkan \"1234\". (<code class=\"language-text\">[0-9]*</code> adalah regular expression untuk menangkap angka 0 sampai 9 ditambah <code class=\"language-text\">*</code> yang berarti kemunculan angka sebanyak apa pun).</li>\n</ul>\n<hr>\n<h2>Bagian: Struktur kondisi</h2>\n<h3>IF-ELSE</h3>\n<div class=\"gatsby-highlight\" data-language=\"sh\"><pre class=\"language-sh\"><code class=\"language-sh\">if [[ $a == 1 ]]; then\n    echo &quot;a is 1&quot;\nelif [[ $a == 2 ]]; then\n    echo &quot;a is 2&quot;\nelse\n    echo &quot;a is not 1 nor 2&quot;\nfi</code></pre></div>\n<p><img src=\"/assets/resources/try-bash/if.png\" alt=\"bash if-else\"></p>\n<p>Strukturnya adalah <code class=\"language-text\">if</code>–<code class=\"language-text\">then</code>–<code class=\"language-text\">elif</code>–<code class=\"language-text\">then</code>–<code class=\"language-text\">else</code> dan ditutup <code class=\"language-text\">fi</code> di akhir.</p>\n<h3>FOR-loop</h3>\n<div class=\"gatsby-highlight\" data-language=\"sh\"><pre class=\"language-sh\"><code class=\"language-sh\">for i in $list; do\n    echo this is $i\ndone</code></pre></div>\n<p><img src=\"/assets/resources/try-bash/for.png\" alt=\"bash for-loop\"></p>\n<p>Paling sering dipakai ketika kita harus melakukan sesuatu untuk setiap item dalam sebuah daftar.</p>\n<h3>WHILE-loop</h3>\n<div class=\"gatsby-highlight\" data-language=\"sh\"><pre class=\"language-sh\"><code class=\"language-sh\">while [[ $a -le 10 ]]; do # cek apakah a kurang dari atau sama dengan 10\n    echo &quot;$a&quot;;\n    a=$((a+1)); # a = a + 1\ndone</code></pre></div>\n<p><img src=\"/assets/resources/try-bash/while.png\" alt=\"bash while-loop\"></p>\n<p>Jangan sampai membuat infinite loop.</p>\n<h3>TRY-CATCH</h3>\n<p>Sebenarnya Bash tidak punya blok try-catch, tapi kita bisa menerapkannya seperti ini.</p>\n<div class=\"gatsby-highlight\" data-language=\"sh\"><pre class=\"language-sh\"><code class=\"language-sh\">{\n    # try\n} || {\n    # catch\n}</code></pre></div>\n<p>Kode di atas menjalankan blok try, dan jika gagal baru menjalankan blok catch. Keduanya dihubungkan dengan <code class=\"language-text\">||</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"sh\"><pre class=\"language-sh\"><code class=\"language-sh\">{\n    # try\n} &amp;&amp; {\n    # then\n}</code></pre></div>\n<p>Dan kode di atas menjalankan blok try, dan jika berhasil baru menjalankan blok then. Keduanya dihubungkan dengan <code class=\"language-text\">&amp;&amp;</code>.</p>\n<p><img src=\"/assets/resources/try-bash/try-catch.png\" alt=\"bash try-catch\"></p>\n<ul>\n<li>File pertama – test02_v1.sh\nSaya menambahkan <code class=\"language-text\">exit 1</code> untuk memicu error dan mendefinisikan \"<strong>jika gagal</strong>, tampilkan this is part 2\". Kita mendapat pesan part 2 karena blok pertama gagal.</li>\n<li>File kedua – test02_v2.sh\nSaya mengubah kondisinya menjadi \"<strong>jika berhasil</strong>, tampilkan this is part 2\". Kita tidak mendapat apa-apa karena blok pertama gagal.</li>\n<li>File ketiga – test02_v3.sh\nSaya menghapus <code class=\"language-text\">exit 1</code> dan mempertahankan kondisi \"<strong>jika berhasil</strong>, tampilkan this is part 2\". Kita mendapat part 1 dan part 2 karena blok pertama berhasil.</li>\n</ul>\n<p>Ini adalah penanganan error dasar yang penting untuk mengatur alur pekerjaan.</p>\n<blockquote>\n<p>perhatikan spasi di antara tanda kurung dan operator.</p>\n</blockquote>\n<hr>\n<h2>Bagian: Tanggal dan waktu</h2>\n<p>Perintah yang paling sering saya gunakan hanya satu, yaitu <code class=\"language-text\">date</code>, tetapi ada banyak penerapannya.</p>\n<div class=\"gatsby-highlight\" data-language=\"sh\"><pre class=\"language-sh\"><code class=\"language-sh\">$(date +&quot;%Y-%m-%d&quot;)\n$(date -d &quot;-[n] day&quot; +&quot;%Y-%m-%d&quot;)\n$(date -d &quot;[n] day ago&quot; +&quot;%Y-%m-%&quot;)\n$(date -d &quot;$(date -d @[epoch_in_seconds])&quot; +&quot;%Y-%m-%d&quot; )\n$(date -d &quot;$[target_date] [n] day&quot; +&quot;%Y-%m-%d&quot;)\nif [[ $(date -d &quot;$date_one&quot; +%s) -le $(date -d &quot;$date_two&quot; +%s) ]]; then\n    echo &quot;$date_one is LESS THAN OR EQUAL TO $date_two&quot;\nelse\n    echo &quot;$date_one is GREATER THAN $date_two&quot;\nfi</code></pre></div>\n<p><img src=\"/assets/resources/try-bash/date.png\" alt=\"bash date\"></p>\n<p><code class=\"language-text\">-d</code> akan menerjemahkan string menjadi objek tanggal. Seperti contoh di atas, <code class=\"language-text\">-1 day</code> sama dengan <code class=\"language-text\">1 day ago</code> yang berarti kemarin, sehingga <code class=\"language-text\">2019-01-01 1 day</code> berarti \"1 hari setelah 2019-01-01\" yaitu 2019-01-02.</p>\n<p><code class=\"language-text\">@[epoch_in_second]</code> adalah UNIX epoch, bentuk integer dari objek tanggal, misalnya <code class=\"language-text\">@1546300800</code> sama dengan \"2019-01-01 00:00:00 AM\" (informasi lebih lanjut di <a href=\"https://www.epochconverter.com\">epochconverter.com</a>).</p>\n<p><code class=\"language-text\">+\"...\"</code> mendefinisikan format keluaran. Contohnya, <code class=\"language-text\">+\"%Y-%m-%d\"</code> berarti \"tahun-bulan-tanggal\" misalnya 2019-01-10, dan <code class=\"language-text\">+\"%s\"</code> berarti format epoch seperti yang disebutkan sebelumnya. Format terakhir bisa dipakai untuk membandingkan dua tanggal seperti kumpulan perintah terakhir di atas.</p>\n<hr>\n<h2>Bagian: Eksekusi eksternal</h2>\n<ul>\n<li><code class=\"language-text\">source</code>\nMerujuk ke file Bash lain</li>\n<li><code class=\"language-text\">sh</code>\nMengeksekusi file Bash dari luar</li>\n</ul>\n<p><img src=\"/assets/resources/try-bash/source.png\" alt=\"bash exec\"></p>\n<p>File pertama – \"test01.sh\" berisi \"test<em>var\". Setelah <code class=\"language-text\">source test01.sh</code>, kita bisa menampilkan nilai \"test</em>var\" dari luar.</p>\n<p>File kedua – \"test02.sh\" berisi perintah <code class=\"language-text\">echo</code>. Setelah <code class=\"language-text\">sh test02.sh</code>, ia memicu <code class=\"language-text\">echo</code> dan menampilkan teksnya.</p>\n<hr>\n<h2>Bagian: Fungsi</h2>\n<p>Struktur fungsi dijelaskan di bawah ini:</p>\n<div class=\"gatsby-highlight\" data-language=\"sh\"><pre class=\"language-sh\"><code class=\"language-sh\">sample_func() {\n  local a=$1 # variabel lokal\n  local b=$2 # variabel lokal\n  echo &quot;first is $a and second is $b&quot;\n}\n\nsample_func 1 2</code></pre></div>\n<p><img src=\"/assets/resources/try-bash/func.png\" alt=\"bash func\"></p>\n<p>Kita harus mendefinisikan fungsi sebelum menggunakannya. Cara memanggilnya adalah dengan mengetik nama fungsinya diikuti parameter yang dipisahkan spasi.</p>\n<p>Seperti contoh, kita memanggil <code class=\"language-text\">sample_func</code> dengan parameter 1 dan 2. Di dalam fungsi, nilai \"1\" menjadi <code class=\"language-text\">$1</code> dan ditugaskan ke variabel a, sedangkan nilai \"2\" menjadi <code class=\"language-text\">$2</code> lalu ditugaskan ke variabel b. Di akhir, ia menampilkan \"first is 1 and second is 2\".</p>\n<hr>\n<h2>Bagian: Komentar</h2>\n<p>Ada 2 cara menambahkan komentar</p>\n<ul>\n<li>sisipkan <code class=\"language-text\">#</code> di depan baris</li>\n<li>mulai komentar multiline dengan <code class=\"language-text\">: &lt;&lt; [word]</code> dan akhiri dengan <code class=\"language-text\">[word]</code></li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"sh\"><pre class=\"language-sh\"><code class=\"language-sh\"># ini komentar satu baris\n: &lt;&lt; &#39;comment&#39;\n    ini\n    adalah\n    komentar\n    beberapa\n    baris\ncomment</code></pre></div>\n<p><img src=\"/assets/resources/try-bash/comment.png\" alt=\"bash comment\"></p>\n<p>Seperti contoh, \"b\" tidak akan tampil karena ia komentar. Begitu juga \"d\", \"e\", dan \"f\" karena berada dalam komentar multiline yang dikendalikan oleh kata \"a_comment\".</p>\n<hr>\n<p>Seperti yang saya katakan, ini adalah perintah-perintah yang paling sering saya gunakan dalam pekerjaan. Masih ada banyak perintah lain yang tidak disebutkan di sini. Semoga bermanfaat!</p>\n<hr>\n<h2>Referensi</h2>\n<ul>\n<li><a href=\"https://www.tecmint.com/add-users-in-linux/\">https://www.tecmint.com/add-users-in-linux/</a></li>\n<li><a href=\"https://en.wikipedia.org/wiki/AWK\">https://en.wikipedia.org/wiki/AWK</a></li>\n<li><a href=\"https://support.rackspace.com/how-to/checking-linux-file-permissions-with-ls/\">https://support.rackspace.com/how-to/checking-linux-file-permissions-with-ls/</a></li>\n<li><a href=\"https://stackoverflow.com/questions/6961389/exception-handling-in-shell-scripting/6961470\">https://stackoverflow.com/questions/6961389/exception-handling-in-shell-scripting/6961470</a></li>\n<li><a href=\"https://bashitout.com/2013/05/18/Ampersands-on-the-command-line.html\">https://bashitout.com/2013/05/18/Ampersands-on-the-command-line.html</a></li>\n</ul>","frontmatter":{"date":"November 10, 2019","path":"/resources/try-bash","title":"Belajar Bash: Dasar-Dasar Shell Script","thumbnail":"","metaDescription":"Tutorial dasar Bash untuk pemula: path, file, permission, operator, string, kondisi, perulangan, dan fungsi."}}},"pageContext":{}},"staticQueryHashes":["3159585216","440143384"]}