GNU/Linux >> Belajar Linux >  >> Linux

Cara menggunakan input dalam skrip shell Anda

Ini kutipan lama, tapi menurut saya prinsip dari penemu Perl Larry Wall ini masih berlaku:

"Pemrogram yang malas akan menggunakan kembali apa pun yang mereka bisa untuk menyelesaikan pekerjaannya. Keutamaan ini mengarah pada penggunaan kembali kode dengan mendorong kode untuk ditulis hanya sekali."

— Larry Wall, "Tiga kebajikan seorang programmer"

Katakanlah Anda bosan mengetik urutan perintah yang sama dan akhirnya membuat skrip shell yang bagus untuk menjalankan berbagai hal dengan penekanan tombol yang lebih sedikit. Namun terkadang Anda ingin menjalankannya dengan argumen yang berbeda, dan Anda pasti tidak ingin menduplikasi skrip hebat Anda. Anda memerlukan cara untuk menyediakan dan menggunakan argumen dari baris perintah. Artikel ini membahas hal itu.

Proses input skrip

Skrip shell memiliki akses ke beberapa variabel "ajaib" dari lingkungan:

  • $0 - Nama naskah
  • $1 - Argumen pertama dikirim ke skrip
  • $2 - Argumen kedua dikirim ke skrip
  • $3 - Argumen ketiga... dan seterusnya
  • $# - Jumlah argumen yang diberikan
  • $@ - Daftar semua argumen yang disediakan
#!/bin/bash

if [ $# -eq 0 ];
then
  echo "$0: Missing arguments"
  exit 1
elif [ $# -gt 2 ];
then
  echo "$0: Too many arguments: $@"
  exit 1
else
  echo "We got some argument(s)"
  echo "==========================="
  echo "Number of arguments.: $#"
  echo "List of arguments...: $@"
  echo "Arg #1..............: $1"
  echo "Arg #2..............: $2"
  echo "==========================="
fi

echo "And then we do something with $1 $2"

Berikut adalah beberapa contoh mengeksekusi ini dengan kombinasi argumen yang berbeda:

$ ./ex01.sh 
./ex01.sh: Missing arguments

$ ./ex01.sh aa
We got some argument(s)
===========================
Number of arguments.: 1
List of arguments...: aa
Arg #1..............: aa
Arg #2..............: 
===========================
And then we do something with aa 

$ ./ex01.sh aa bb
We got some argument(s)
===========================
Number of arguments.: 2
List of arguments...: aa bb
Arg #1..............: aa
Arg #2..............: bb
===========================
And then we do something with aa bb

$ ./ex01.sh aa bb cc
./ex01.sh: Too many arguments: aa bb cc

Ini bagus jika Anda memiliki satu atau dua argumen. Namun, perhatikan pemisah default antara argumen adalah karakter Spasi. Dan karena Space adalah pemisah default untuk argumen, hal-hal menarik bisa terjadi. Misalnya, inilah yang terjadi jika Anda menggunakan tanda kutip dengan lebih dari dua argumen:

$ ./ex01.sh aa "bb cc xx yy zz"
We got some argument(s)
===========================
Number of arguments.: 2
List of arguments...: aa bb cc xx yy zz
Arg #1..............: aa
Arg #2..............: bb cc xx yy zz
===========================
And then we do something with aa bb cc xx yy zz

Perhatikan bahwa skrip menafsirkan bb cc xx yy zz sebagai satu argumen karena nilainya diapit oleh tanda kutip ganda, yang juga tidak masalah jika ini yang Anda inginkan.

[ Jaga agar perintah Linux Anda tetap dekat. Download lembar contekan perintah Linux Lanjutan. ]

Hal menarik lainnya adalah ketika skrip Anda mendapatkan argumen dari variabel . Jika variabel berisi spasi, Anda perlu memutuskan apakah Anda ingin itu nilai untuk diperlakukan sebagai argumen tunggal atau semua bagian diperlakukan sebagai argumen yang berbeda:

$ export AUTHOR="John Lennon"

$ export SONG="Imagine"

$ ./ex01.sh $AUTHOR $SONG
./ex01.sh: Too many arguments: John Lennon Imagine

$ ./ex01.sh "$AUTHOR" "$SONG"
We got some argument(s)
===========================
Number of arguments.: 2
List of arguments...: John Lennon Imagine
Arg #1..............: John Lennon
Arg #2..............: Imagine
===========================
And then we do something with John Lennon Imagine

Saat Anda mengirim argumen sebagai variabel tanpa tanda kutip, skrip menafsirkan semuanya sebagai kata terpisah dan "melihat" tiga argumen:John , Lennon , dan Bayangkan .

Menggunakan tanda kutip sekitar variabel membuat skrip menerima setiap variabel sebagai satu argumen, yang lebih masuk akal dalam kasus ini.

Tangani lebih banyak argumen

Seperti yang Anda lihat, variabel ajaib $@ berisi daftar semua argumen yang diterima oleh skrip. Anda dapat menggunakan loop untuk memproses semua argumen:

#!/bin/bash

echo "We received $# argument(s)"

for i in "$@"
do
  echo "Arg...: $i"
done

Yang memberi Anda ini:

$ ./ex02.sh a b c e "stuff with spaces"
We received 5 argument(s)
Arg...: a
Arg...: b
Arg...: c
Arg...: e
Arg...: stuff with spaces

Jadilah pintar dengan menjadi malas

Hal penting ketika berhadapan dengan argumen dalam skrip shell Anda adalah memiliki pemahaman yang jelas tentang:

  • Apa bentuk isi argumen?
    • Jika disediakan sebagai variabel, apa yang "pengirim" masukkan ke dalam variabel itu untuk Anda?
    • Jika disediakan oleh masukan pengguna, bagaimana Anda bisa memastikan pengguna tidak "merusak" logika Anda?
  • Argumen mana yang dapat diterima atau wajib untuk Anda naskah?
    • Apa yang ingin Anda lakukan jika argumennya tidak valid? Skrip dapat menimbulkan kesalahan atau mungkin menggunakan nilai default.

Saya harap ini membantu Anda terus bermalas-malasan dengan cara yang benar... dengan meningkatkan atau menggunakan kembali beberapa skrip Anda.


Linux
  1. Cara mengatur variabel $PATH Anda di Linux

  2. Cara menggunakan dd di Linux tanpa merusak disk Anda

  3. Bagaimana cara menggunakan perintah su melalui adb shell?

  1. Bagaimana Cara Menjatuhkan Hak Istimewa Root Dalam Skrip Shell?

  2. Bagaimana Menangani Switch Dalam Script Shell?

  3. Bagaimana Cara Menggunakan Boolean Dalam Cangkang Ikan?

  1. Fungsi Bash &Cara Menggunakannya {Variabel, Argumen, Pengembalian}

  2. Cara Menggunakan Variabel di Shell Scripting

  3. Cara Menggunakan Server Khusus Anda