Pemrograman · Bahasa pemrograman
Tutorial scripting Bash untuk pemula
Jawaban singkat
Bash adalah shell dan bahasa scripting command line Unix yang dipakai di server Linux, terminal macOS, dan pipeline CI. Skrip Bash adalah file teks berisi perintah shell yang dipadukan dengan variabel, kondisi, loop, fungsi, dan pipe. Halaman ini menunjukkan cara menulis dan menjalankan skrip, memberi quote pada variabel dengan aman, alur kontrol, memakai array, mengalihkan output, dan menangani error dengan set -euo pipefail.
Buka Kalkulator chmodApa itu Bash dan untuk apa digunakan
Bash (Bourne Again SHell) adalah shell command line dan bahasa scripting dari GNU Project. Bash membaca perintah yang Anda ketik, menjalankan program, dan menghubungkannya dengan pipe dan redirection. Skrip Bash adalah file teks berisi perintah-perintah yang sama, sehingga apa pun yang Anda lakukan manual di terminal bisa diotomatisasi.
Bash adalah shell interaktif default di sebagian besar distro Linux dan tersedia di macOS (yang kini memakai zsh sebagai default tetapi masih menyertakan Bash) serta di Windows lewat WSL atau Git Bash. Developer, system administrator, dan DevOps engineer memakainya untuk skrip build, deployment, job CI, pemeliharaan server, dan pemrosesan data cepat dengan tool seperti grep, sed, awk, dan sort.
Tulis dan jalankan Hello, world
Skrip diawali baris shebang yang memberi tahu sistem interpreter mana yang dipakai. Buat file bisa dieksekusi dengan chmod, lalu jalankan.
#!/usr/bin/env bash
# hello.sh
echo "Hello, world!"chmod +x hello.sh
./hello.sh
# Hello, world!
bash hello.sh # also works without chmod
bash --version # check which version you have#!/usr/bin/env bash mencari Bash di PATH, yang lebih portabel daripada menulis /bin/bash secara tetap. Jika skrip hanya memakai fitur POSIX, Anda bisa memakai #!/bin/sh, tetapi sintaks khusus Bash seperti [[ ]] dan array tidak boleh dipakai.
Variabel, quoting, dan expansion
Isi dengan name=value dan baca dengan $name atau ${name}. Setiap variabel adalah string; Bash hanya melakukan aritmetika bilangan bulat di dalam $(( )). Gunakan tanda kutip ganda di sekitar expansion agar spasi dan karakter khusus tetap utuh.
name="Ada" # no spaces around =
count=3
echo "Hello, $name" # Hello, Ada
echo "Next: $((count + 1))" # Next: 4 (integer arithmetic)
today=$(date +%Y-%m-%d) # command substitution
echo "Today is $today"
file="my report.txt"
echo "${file%.txt}.pdf" # my report.pdf (strip suffix)
echo "${#name}" # 3 (string length)
echo "${missing:-default}" # default (fallback value)| Sintaks | Arti |
|---|---|
"$var" | nilai var, tetap sebagai satu kata |
'text' | teks literal, tanpa expansion sama sekali |
$(command) | output sebuah perintah |
$((a + b)) | aritmetika bilangan bulat |
$1, $2, $@, $# | argumen skrip atau fungsi, semua argumen, jumlah argumen |
$? | exit status perintah terakhir (0 berarti sukses) |
Kondisi dan case
if menjalankan perintah dan memeriksa exit status-nya. Perintah tes [[ ]] membandingkan string dan memeriksa file; (( )) membandingkan angka. case mencocokkan nilai dengan pola glob.
#!/usr/bin/env bash
file="${1:-notes.txt}"
if [[ -f "$file" ]]; then
echo "$file exists"
elif [[ -d "$file" ]]; then
echo "$file is a directory"
else
echo "$file not found"
fi
n=7
if (( n % 2 == 1 )); then echo "$n is odd"; fi
case "$file" in
*.txt) echo "text file" ;;
*.sh) echo "shell script" ;;
*) echo "something else" ;;
esac| Tes | Benar jika |
|---|---|
[[ -f path ]] | path adalah file biasa |
[[ -d path ]] | path adalah direktori |
[[ -z "$s" ]] | string kosong |
[[ "$a" == "$b" ]] | string sama |
(( a > b )) | angka a lebih besar dari b |
[[ $a -lt $b ]] | angka a lebih kecil dari b (gaya lama) |
Loop
Bash punya for atas daftar kata, for (( )) bergaya C, while, dan until. Membaca file baris demi baris memakai while read.
for fruit in apple banana cherry; do
echo "fruit: $fruit"
done
for (( i = 1; i <= 3; i++ )); do
echo "i = $i"
done
for f in *.log; do
[[ -e "$f" ]] || continue # skip if no .log files match
echo "log file: $f"
done
while IFS= read -r line; do
echo "line: $line"
done < input.txtIFS= read -r membaca tiap baris persis seperti tertulis: IFS= mempertahankan spasi di depan dan -r mempertahankan backslash.
Fungsi
Definisikan fungsi dengan name() { ... } dan panggil seperti perintah. Argumen datang sebagai $1, $2, dan seterusnya. Fungsi mengembalikan exit status (0 sampai 255) dengan return; untuk mengembalikan data, cetak datanya dan tangkap outputnya dengan $( ).
greet() {
local name="${1:-world}" # local variable, default value
echo "Hello, $name!"
}
is_even() {
(( $1 % 2 == 0 )) # exit status 0 means true
}
greet # Hello, world!
greet "Ann" # Hello, Ann!
msg=$(greet "Bo") # capture output
echo "Got: $msg" # Got: Hello, Bo!
if is_even 4; then echo "4 is even"; fiArray dan associative array
Indexed array menyimpan daftar string. Associative array memetakan key string ke nilai dan membutuhkan Bash 4 atau lebih baru, sehingga tidak tersedia di Bash 3.2 lama yang disertakan macOS.
langs=("bash" "python" "go")
langs+=("rust")
echo "${langs[0]}" # bash
echo "${#langs[@]}" # 4
for l in "${langs[@]}"; do echo "- $l"; done
# associative array (Bash 4 or later)
declare -A port
port[http]=80
port[https]=443
echo "${port[https]}" # 443
for key in "${!port[@]}"; do
echo "$key -> ${port[$key]}"
doneSelalu tulis "${array[@]}" dengan tanda kutip untuk mengiterasi elemen; ini menjaga setiap elemen sebagai satu kata meskipun berisi spasi.
Pipe dan redirection
Fitur khas Bash adalah menyusun program-program kecil. Pipe | mengirim output satu perintah ke input perintah berikutnya. Redirection mengirim output ke file atau membaca input dari file. File descriptor 1 adalah standard output dan 2 adalah standard error.
ls -l > files.txt # write stdout to a file (overwrite)
echo "more" >> files.txt # append
grep error app.log 2> /dev/null # discard error messages
make > build.log 2>&1 # stdout and stderr to the same file
# count the 3 most common words in a file
tr -cs '[:alpha:]' '\n' < book.txt | tr '[:upper:]' '[:lower:]' |
sort | uniq -c | sort -rn | head -n 3Penanganan error dan skrip yang aman
Secara default Bash terus berjalan setelah sebuah perintah gagal. Banyak skrip diawali set -euo pipefail: -e keluar saat ada error yang tidak ditangani, -u memperlakukan variabel yang belum diatur sebagai error, dan -o pipefail membuat pipeline gagal jika ada perintah di dalamnya yang gagal. trap menjalankan kode pembersihan saat skrip keluar.
#!/usr/bin/env bash
set -euo pipefail # stop on errors, unset vars, pipe failures
tmp=$(mktemp)
trap 'rm -f "$tmp"' EXIT # clean up when the script exits
if ! grep -q "ready" status.txt; then
echo "status is not ready" >&2 # errors go to stderr
exit 1
fi
cp config.txt "$tmp" || { echo "copy failed" >&2; exit 2; }
echo "ok"Gunakan || untuk menangani kegagalan dalam satu baris dan && untuk menjalankan perintah hanya jika perintah sebelumnya berhasil. set -e punya pengecualian (misalnya, perintah di dalam kondisi if tidak memicunya), jadi periksa perintah penting secara eksplisit.
Skrip lengkap kecil: backup bertanggal
Skrip ini mengarsipkan direktori ke file .tar.gz berstempel waktu dan hanya menyimpan lima arsip terbaru. Skrip ini memakai argumen, nilai default, tes, command substitution, dan pipe.
#!/usr/bin/env bash
# backup.sh: copy a directory into a dated .tar.gz archive
set -euo pipefail
usage() { echo "usage: $0 SOURCE_DIR [DEST_DIR]" >&2; exit 1; }
[[ $# -ge 1 ]] || usage
src="$1"
dest="${2:-$HOME/backups}"
[[ -d "$src" ]] || { echo "not a directory: $src" >&2; exit 1; }
mkdir -p "$dest"
stamp=$(date +%Y%m%d-%H%M%S)
archive="$dest/$(basename "$src")-$stamp.tar.gz"
tar -czf "$archive" -C "$(dirname "$src")" "$(basename "$src")"
size=$(du -h "$archive" | cut -f1)
echo "Created $archive ($size)"
# keep only the 5 newest archives for this source
ls -1t "$dest"/"$(basename "$src")"-*.tar.gz | tail -n +6 | while read -r old; do
rm -f -- "$old"
echo "Removed $old"
done./backup.sh ~/projects/site
# Created /home/ann/backups/site-20261031-093000.tar.gz (2.1M)Langkah selanjutnya
- GNU Bash Reference Manual, dokumentasi resmi.
man bashdanhelp(misalnyahelp read) di terminal Anda.- ShellCheck, tool analisis statis yang menjelaskan bug umum pada skrip.
- Spesifikasi POSIX shell jika Anda butuh skrip yang juga berjalan di
sh,dash, atau BusyBox.
FAQ
Apa perbedaan Bash dan sh?
sh adalah standar POSIX shell, diimplementasikan oleh program seperti dash. Bash kompatibel dengan POSIX sh tetapi menambahkan fitur seperti [[ ]], array, (( )), dan brace expansion.
Apa perbedaan Bash dan zsh?
Keduanya kompatibel untuk sebagian besar perintah sehari-hari. zsh menambahkan fitur interaktif dan merupakan shell default di macOS; skrip yang ditulis dengan shebang bash tetap berjalan dengan Bash.
Mengapa skrip saya menampilkan permission denied?
File belum executable. Jalankan chmod +x script.sh, atau mulai dengan bash script.sh.
Bagaimana cara memberi argumen ke skrip Bash?
Tulis setelah nama skrip, seperti ./script.sh one two. Di dalam skrip, argumen itu adalah $1 dan $2, $@ berisi semuanya, dan $# adalah jumlahnya.
Haruskah saya menulis program besar dengan Bash?
Bash paling cocok untuk merangkai perintah. Ketika skrip menjadi kompleks, membutuhkan struktur data atau penanganan error yang cermat, bahasa seperti Python biasanya lebih mudah dipelihara.