Belajar dengan membaca secara berurutan

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.

SintaksArtiContoh
$1 $2Argumen pertama dan keduaecho "$1 then $2"
$0Nama script itu sendiriecho "running $0"
$#Jumlah argumen yang dilewatkanecho "argc=$#"
$@Semua argumen sekaligusecho "all: $@"
Bagaimana argumen dipetakan
./a.sh foo bar$1 = foo$2 = bar$# = 2$@ = foo barke-1ke-2jumlahsemua
Nilai yang kamu lewatkan masuk ke $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

Buat script yang menerima nilai sebagai argumen dan mencetaknya apa adanya.

① Buka args.sh dengan vi args.sh, tekan i untuk masuk mode insert, dan tulis #!/bin/sh pada baris pertama.

② Tulis kode yang mencetak argumen pertama ($1), kedua ($2), jumlahnya ($#), semua argumen ($@), dan nama script ($0).

③ Tekan Esc, simpan dengan :wq, lalu beri izin eksekusi.

④ Jalankan sebagai ./args.sh foo bar dengan dua argumen dan periksa nilai mana yang masuk ke variabel mana. Kalau kamu bingung, salin isinya dari panel jawaban dan tempelkan ke mode insert vi. (Jalankan dengan benar dan penjelasan akan muncul.)

Linux console
0 / 3 selesai
Loading Linux Terminal...

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.

SintaksArtiContoh
${1:-def}Pakai def saat $1 belum disetname=${1:-guest}
${2:-def}Pakai def saat $2 belum disetsep=${2:--}
Bagaimana default diberikan
sep=${2:--}$2 = barsep = bar$2 kosongsep = - (default)jika diberijika dihilangkanSesuai diberikanPakai default
Dengan ${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

Buat script yang menerima sebuah pemisah sebagai argumen dan memakai default saat dihilangkan.

① Buka format.sh dengan vi format.sh, tekan i untuk masuk mode insert, dan tulis #!/bin/sh pada baris pertama.

② Terima argumen pertama sebagai nama target dan kedua sebagai pemisah, tetapi tulis dengan ${2:-...} agar default (misalnya -) dipakai saat yang kedua tidak ada, lalu cetak target dan pemisahnya.

③ Tekan Esc, simpan dengan :wq, lalu beri izin eksekusi.

④ Pertama jalankan sebagai ./format.sh foo, menghilangkan argumen kedua, dan periksa bahwa pemisah jatuh ke default. Kalau kamu bingung, salin isinya dari panel jawaban dan tempelkan ke mode insert vi.

Linux console
0 / 3 selesai
Loading Linux Terminal...

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.

SintaksArtiContoh
$?Exit code dari perintah sebelumnyagrep x f; echo $?
exit NAkhiri script dengan exit code Nexit 1
Bagaimana exit code mengalir
Proses suksesexit 0$? = 0Proses gagalexit 1$? = 1mengembalikanmembacamengembalikanmembacaSuksesGagal
Script mengembalikan 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

Buat script yang mencari sebuah kata di file berdasarkan argumen dan mengembalikan exit code sesuai hasilnya.

① Buka search.sh dengan vi search.sh, tekan i untuk masuk mode insert, dan tulis #!/bin/sh pada baris pertama.

② Di dalam script, buat sebuah file bahan dan cari kata yang diterima sebagai argumen pertama di file itu. Tulis kode yang mencetak pesan sukses dan mengembalikan exit 0 saat ditemukan, atau mencetak pesan gagal dan mengembalikan exit 1 saat tidak.

③ Tekan Esc, simpan dengan :wq, lalu beri izin eksekusi.

④ Jalankan sebagai ./search.sh foo bar, lalu periksa exit code dengan echo $?. Kalau kamu bingung, salin isinya dari panel jawaban dan tempelkan ke mode insert vi.

Linux console
0 / 3 selesai
Loading Linux Terminal...

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.

SintaksArtiContoh
"$@"Lewatkan setiap argumen satu kata sekaligus (untuk for; butuh tanda kutip ganda)for x in "$@"; do
$#Jumlah argumen yang dilewatkanecho "count=$#"
Memutar semua argumen
./a.sh foo bar baz$# = 3$@ = foo bar bazfor x in "$@"- foo- bar- bazjumlahsemuasatu per satucetakputar dengan for
Dapatkan jumlahnya dengan $#, 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

Buat script yang memproses setiap argumen yang dilewatkan satu per satu dan juga menampilkan jumlahnya.

① Buka list.sh dengan vi list.sh, tekan i untuk masuk mode insert, dan tulis #!/bin/sh pada baris pertama.

② Cetak jumlah argumen dengan $#, lalu ambil setiap argumen secara berurutan dengan $@ di loop for dan cetak masing-masing pada barisnya sendiri.

③ Tekan Esc, simpan dengan :wq, lalu beri izin eksekusi.

④ Jalankan sebagai ./list.sh foo bar baz dengan tiga argumen dan periksa bahwa jumlah dan setiap argumen tercetak berurutan. Kalau kamu bingung, salin isinya dari panel jawaban dan tempelkan ke mode insert vi.

Linux console
0 / 3 selesai
Loading Linux Terminal...
QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Apa yang masuk ke $2 saat kamu menjalankan ./a.sh foo bar?

Soal 2Mana arti yang benar dari ${1:-guest}?

Soal 3Mana yang membaca exit code yang menunjukkan apakah perintah sebelumnya sukses?