Soal 1Apa yang masuk ke $2 saat kamu menjalankan ./a.sh foo bar?
Shell Script - Argumen dan Exit Code
Terima nilai ./a.sh foo bar dengan $1 $2 $@ $# $0, beri nilai default dengan ${2:--}, periksa $? dan kembalikan sukses atau gagal dengan exit 0 / exit 1 — tulis dan jalankan script praktis, divisualkan di terminal browser.
Menerima Argumen — $1 / $2 / $0
Script bisa menerima nilai saat kamu menjalankannya.
Nilai yang kamu deretkan setelah perintah, seperti ./a.sh foo bar, disebut argumen, dan di dalam script $1 adalah yang pertama serta $2 adalah yang kedua.
$0 adalah nama script itu sendiri, $# adalah jumlah argumen yang dilewatkan, dan $@ mewakili semuanya sekaligus.
Dengan ini kamu bisa menjalankan script dengan input berbeda setiap kali alih-alih dengan nilai tetap.
| Sintaks | Arti | Contoh |
|---|---|---|
$1 $2 | Argumen pertama dan kedua | echo "$1 then $2" |
$0 | Nama script itu sendiri | echo "running $0" |
$# | Jumlah argumen yang dilewatkan | echo "argc=$#" |
$@ | Semua argumen sekaligus | echo "all: $@" |
$1 $2; $# memberi jumlahnya dan $@ seluruh himpunannya.set -- foo bar # set parameter posisi untuk demo
echo "1st: $1" # foo
echo "2nd: $2" # bar
echo "argc: $#" # 2
echo "all: $@" # foo bar
Memberi Nilai Default — ${1:-def}
Kadang tidak ada argumen yang dilewatkan.
Kalau kamu menulis ${1:-default}, default dipakai saat $1 belum diset atau kosong, dan nilai yang diberikan dipakai saat satu disediakan.
Ini membuat kamu bisa menulis script yang mengikuti argumen saat diberikan, dan berjalan dengan default yang aman saat tidak.
Memeriksa $# juga memberitahumu apakah jumlah argumen yang diharapkan sudah tiba.
| Sintaks | Arti | Contoh |
|---|---|---|
${1:-def} | Pakai def saat $1 belum diset | name=${1:-guest} |
${2:-def} | Pakai def saat $2 belum diset | sep=${2:--} |
${2:--}, melewatkan nilai kedua memakainya, dan menghilangkannya memakai default -.set -- # tiru menjalankan tanpa argumen
echo "${1:-guest}" # belum diset, jadi guest
set -- alice # kini argumen pertama diset
echo "${1:-guest}" # punya nilai, jadi alice
Mengembalikan Sukses atau Gagal — $? dan exit N
Saat sebuah perintah selesai, ia mengembalikan exit code, sebuah angka dari 0 sampai 255.
Menurut konvensi 0 berarti sukses dan apa pun selain 0 berarti gagal.
Kamu bisa membaca exit code perintah sebelumnya dengan $?.
Untuk grep nilainya 0 saat ditemukan dan 1 saat tidak, jadi nilainya berubah mengikuti hasil.
Dari dalam script kamu mengatur exit code secara eksplisit dengan exit N.
Mengembalikan exit 0 untuk sukses dan exit 1 untuk gagal adalah konvensi yang umum.
Pemanggil menerima nilai ini lewat $? atau && || dan bisa memakainya untuk kendali seperti melanjutkan hanya saat sukses.
Kalau kamu menghilangkan exit, exit code dari perintah terakhir yang dijalankan dikembalikan apa adanya.
| Sintaks | Arti | Contoh |
|---|---|---|
$? | Exit code dari perintah sebelumnya | grep x f; echo $? |
exit N | Akhiri script dengan exit code N | exit 1 |
exit 0 saat sukses dan exit 1 saat gagal, dan pemanggil membaca hasilnya dengan $?.printf 'apple\nbanana\n' > fruits.txt # buat bahannya
grep apple fruits.txt > /dev/null
echo "found? $?" # ditemukan, jadi 0
grep mango fruits.txt > /dev/null
echo "found? $?" # tidak ditemukan, jadi 1
Memproses Setiap Argumen Berurutan — $@ dan $#
Saat jumlah argumen tidak tetap, alih-alih menulis $1 $2 satu per satu, putar $@ dengan for untuk memproses sebanyak yang dilewatkan.
Bentuk for x in "$@"; do … done mengambilnya satu per satu, dan menampilkan jumlahnya dengan $# membuat script yang sama menangani berapa pun jumlah argumennya.
Ini pola yang umum di alat yang memproses beberapa file sekaligus.
| Sintaks | Arti | Contoh |
|---|---|---|
"$@" | Lewatkan setiap argumen satu kata sekaligus (untuk for; butuh tanda kutip ganda) | for x in "$@"; do |
$# | Jumlah argumen yang dilewatkan | echo "count=$#" |
$#, lalu ambil setiap argumen satu per satu dengan $@ di loop for untuk memprosesnya.set -- foo bar baz # set parameter posisi untuk demo
echo "argc: $#" # 3
for x in "$@"; do
echo "- $x" # - foo / - bar / - baz
done
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Mana arti yang benar dari ${1:-guest}?
Soal 3Mana yang membaca exit code yang menunjukkan apakah perintah sebelumnya sukses?