Variabel bash khusus dengan contoh
- 1159
- 208
- Ricardo Gottlieb
Bash adalah bahasa pengkodean yang hebat, yang memungkinkan Anda melakukan hal -hal kompleks seperti manipulasi data besar, atau sekadar membuat skrip manajemen Sever atau Desktop.
Keterampilan entry level yang diperlukan untuk menggunakan bahasa bash cukup rendah, dan skrip satu-liner (jargon yang sering digunakan, yang menunjukkan beberapa perintah yang dieksekusi di baris perintah, membentuk skrip mini), serta skrip reguler, dapat tumbuh dalam kompleksitas (dan seberapa baik tertulisnya) ketika pengembang bash belajar lebih banyak.
Belajar menggunakan variabel khusus dalam bash adalah salah satu bagian dari kurva pembelajaran ini. Sedangkan awalnya variabel khusus mungkin terlihat samar: $$, $?, $*, \ $ 0, $ 1, dll.
, Setelah Anda memahaminya dan menggunakannya dalam skrip Anda sendiri, hal -hal akan segera menjadi lebih jelas dan lebih mudah diingat.
Dalam tutorial ini Anda akan belajar:
- Cara menggunakan variabel khusus dalam bash
- Bagaimana cara mengutip variabel dengan benar, bahkan yang istimewa
- Contoh menggunakan variabel khusus dari baris perintah dan skrip
Persyaratan dan konvensi perangkat lunak yang digunakan
Kategori | Persyaratan, konvensi atau versi perangkat lunak yang digunakan |
---|---|
Sistem | Distribusi Linux-independen |
Perangkat lunak | Baris perintah bash, sistem berbasis Linux |
Lainnya | Utilitas apa pun yang tidak termasuk dalam shell bash secara default dapat diinstal menggunakan sudo apt-get install-name utilitas (atau instalasi yum untuk sistem berbasis redhat) |
Konvensi | # - mengharuskan Linux -Commands untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah$-mengharuskan Linux-Commands untuk dieksekusi sebagai pengguna biasa |
-
$$ - Tampilkan PID (Pengidentifikasi Proses)
Dalam contoh ini, kami menggunakan variabel khusus
$$
untuk menampilkan PID (Pengidentifikasi Proses) Untuk program kami saat ini. Ini berfungsi sedikit berbeda tergantung pada apakah Anda menggunakan variabel ini dari baris perintah:$ echo $$ 316204 $ ps -ef | grep -e "$$ | pid" uid pid ppid c stime tty time cmd roel 316204 62582 0 11:53 poin/2 00:00:00 Bash Roel 316499 316204 0 11:57 PTS/2 00:00:00 PS - EF Roel 316500 316204 0 11:57 poin/2 00:00:00 Grep -e 316204 | PID
Atau dari dalam skrip. Misalnya, mari kita pertimbangkan skrip berikut
tes.SH
:
Menyalinecho $$ ps -ef | grep -e "$$ | pid"
Yang, saat kami membuatnya dapat dieksekusi (
tes chmod +x.SH
) dan jalankan, menghasilkan:$ chmod +x tes.sh $ ./tes.SH 316820 UID PID PPID C STIME TTY TIME CMD ROEL 316820 316204 0 12:01 PTS/2 00:00:00 BASH ROEL 316821 316820 0 12:01 PTS/2 00:00:00 PS -EF ROEL 316822 316820 0 12: 01 poin/2 00:00:00 grep -e 316820 | PID
Perbedaannya ada di Pid diproduksi! Sekilas ini mungkin masuk akal secara konseptual, tetapi mari kita jelaskan alasan utama mengapa Pid berbeda: kami menggunakan shell bash yang berbeda. Perintah pertama yang dieksekusi adalah langsung di baris perintah, dan dengan demikian spesial kami
$$
variabel (yang mengidentifikasi PID dari program yang sedang berjalan) menghasilkan Pid dari shell bash yang sedang berjalan (sedang 316204).Dalam contoh kedua, kami menjalankan skrip dan setiap awal skrip akan selalu memulai shell bash baru. Hasilnya adalah kami Pid adalah Pid dari shell bash yang baru dimulai (316820). Kami juga dapat mengkonfirmasi ini dengan melihat PPID (Saya.e. PID TUA, atau orang tua dari pengidentifikasi proses) - dia 316204 Yang cocok dengan shell bash kami dari mana kami memulai skrip, seperti yang terlihat pada contoh pertama (contoh pertama dan kedua dieksekusi di terminal yang sama pada mesin yang sama).
Itu
grep -e
Perintah dalam dua contoh kami memungkinkan kami untuk menangkap baris pertama dari daftar proses lengkap mesin (seperti yang diperoleh olehps -ef
) dengan mengizinkan dukungan Regex yang diperluas dan Grepping untukPid
selain kami Pid (dengan menggunakan$$
). Itu|
adalah pemisah ekspresi reguler yang diperluas yang memungkinkan penangkapan ganda ini.Untuk informasi lebih lanjut tentang ekspresi reguler, silakan lihat Bash Regexps kami untuk pemula dengan contoh dan lanjutan Bash Regex dengan contoh artikel.
Perhatikan juga bahwa kami telah mengotomatiskan penangkapan PID dengan menggunakan
$$
dalamgrep
memerintah. Ini$$
Variabel tidak pernah berubah kecuali shell / subshell bash baru dimulai, seperti yang dapat kita lihat dalam contoh berikut:$ echo $$ 316204 $ BASH $ ECHO $$ 318023 $ ECHO $ PPID 316204
Itu Pid dari cangkang bash utama kami masih 316204 seperti sebelumnya. Selanjutnya, kami memulai subshell baru dan Pid dari cangkang baru ini 318023 Saat diperiksa. Dan, menggunakan variabel setel otomatis (dengan bash)
$ Ppid
Kami dapat mengkonfirmasi PPID (ID Proses Induk) dari shell/subshell bash sekunder sebagai 316204, yang cocok dengan cangkang utama kami. Seperti yang Anda lihat, dalam hal manajemen proses dan secara khusus$$
variabel, tidak ada banyak perbedaan antara memulai skrip dan subshell baru.Untuk informasi lebih lanjut tentang manajemen proses bash, Anda mungkin ingin memeriksa manajemen proses latar belakang bash dan manajemen daftar proses dan artikel penghentian proses otomatis.
-
$? - Kode Keluar
Itu
$?
Variabel memberi tahu kami apa Kode Keluar adalah perintah sebelumnya. Mengetahui Kode Keluar dari pernyataan yang dieksekusi memungkinkan kami untuk melanjutkan skrip dalam dua atau lebih arah yang berbeda. Misalnya, jika kami memulai arm
Perintah (untuk menghapus beberapa file) dari dalam suatu program, kami mungkin ingin memeriksa apakah proses tersebut berhasil diselesaikan.Jika Kode Keluar adalah
0
, Secara umum (baca: hampir selalu) berarti bahwa suatu proses diakhiri dengan sukses. Jika bagaimanapun Kode Keluar adalah1
(atau lebih) sering (meskipun tidak selalu) berarti bahwa proses diakhiri dengan kesalahan atau hasil negatif, misalnya file tidak dapat dihapus dalam contoh kami. Mari kita lihat bagaimana ini bekerja di baris perintah, mengingat bahwa kerja variabel ini dari dalam skrip adalah identik.$ sentuh ini.ada $ rm ini.ada $ echo $? 0 $ rm ini.melakukan.bukan.ada rm: tidak dapat menghapus 'ini.melakukan.bukan.ada ': tidak ada file atau direktori seperti itu $ echo $? 1
Kami pertama -tama membuat file
ini.ada
dengan menggunakanmenyentuh
memerintah.menyentuh
Cukup buat file nol ukuran tanpa menulis apa pun untuk itu. Selanjutnya kami menghapus file menggunakanrm ini.ada
dan menampilkan$?
Kode keluar menggunakangema
. Hasilnya adalah 0 karena perintah berhasil seperti yang diantisipasi dan dilihat dengan tidak ada kesalahan yang dikembalikan.Selanjutnya, kami mencoba dan menghapus file yang tidak ada dan menerima kesalahan. Saat kita memeriksa kode keluar itu memang
1
menunjukkan beberapa kesalahan terjadi. Kita dapat memeriksa nilai variabel ini dengan mudah dari baris perintah atau dari dalam skrip dengan menggunakanJika [$? -eq 0]; Kemudian
atau pernyataan bersyarat serupa (diakhiri olehfi
).Untuk mempelajari lebih lanjut tentang
jika
pernyataan berbasis, silakan lihat bash jika pernyataan jika elif lagi maka fi. Menggabungkan$?
denganjika
Pernyataan adalah hal yang umum dan kuat untuk mengotomatiskan berbagai hal dalam bash. -
$ 1, $ 2, ... $* - Argumen yang lewat
Ketika kita memulai skrip di baris perintah bash, kita dapat meneruskan argumen ke tempat yang sama. Sepenuhnya tergantung pada skrip untuk menangani argumen yang diteruskan ke sana. Jika skrip misalnya tidak ada penanganan argumen sama sekali (default), maka tidak ada konsekuensi untuk menentukan atau tidak menentukan variabel apa pun, atau banyak, ke skrip.
Kami dapat menangani argumen yang disahkan dengan menggunakan variabel khusus
$ 1
,$ 2
,$*
dll. Argumen pertama yang diteruskan ke skrip akan selalu$ 1
, Argumen kedua akan selalu$ 2
dll. Satu hal yang harus diperhatikan adalah jika Anda memperkenalkan ruang dalam klien bash yang dikonfigurasi default, maka Bash akan menafsirkan ruang itu sebagai pemisah.Jika Anda mencoba lulus beberapa teks seperti misalnya
Ini adalah contohnya
Anda perlu mengutipnya dengan benar seperti ini:"Ini adalah contoh";
Agar Bash dapat melihat teks itu sebagai variabel tunggal yang dilewati.
Yang spesial
$*
Variabel adalah steno untuk menulis semua variabel menjadi satu string. Mari kita lihat bagaimana ini bekerja dengan mendefinisikan yang barutest2.SH
skrip sebagai berikut:
Menyalinecho "1: $ 1" echo "2: $ 2" echo "all: $ *"
Sebagai sedikit variasi, kami memilih untuk mendefinisikan variabel kami di sini sebagai
$ 1
ke$ *
alih-alih$ 1
ke$*
. Faktanya, akan menjadi ide yang baik untuk selalu mengutip variabel dengan cara ini. Untuk informasi lebih lanjut, silakan lihat parsing variabel kami yang benar dan mengutip dalam artikel Bash.Ketika kami menjalankan hal yang sama, menggunakan dua atau tiga argumen, kami melihat:
$ chmod +x test2.sh $ ./test2.SH '1 "2' 1: 1 2: 2 Semua: 1 2 $ ./test2.Sh '1 "2" 3' 1: 1 2: 2 Semua: 1 2 3
Kita dapat melihat bagaimana input pertama kita ke skrip diakui dengan benar sebagai
$ 1
dll. Juga, kami perhatikan bahwa argumen ketiga sepenuhnya diabaikan oleh naskah sampai mencapaiecho "all: $ *"
instruksi yang memang menunjukkan semua argumen seperti yang dibahas sebelumnya. Sekarang mari kita jelajahi input yang salah tanpa mengutip:$ ./test2.SH ini dimaksudkan untuk menjadi satu kalimat. 1: ini 2: adalah semua: ini dimaksudkan untuk menjadi satu kalimat. $ ./test2.SH "Ini dimaksudkan untuk menjadi satu kalimat."1: Ini dimaksudkan untuk menjadi satu kalimat. 2: Semua: Ini dimaksudkan untuk menjadi satu kalimat.
Di sini menjadi jelas bagaimana suatu ruang dapat diartikan sebagai pemisah, bukan ruang yang sebenarnya, kecuali jika teks tersebut dikutip dengan benar. Pada hasil pertama, Ini dilihat sebagai argumen pertama, sedangkan pada hasil kedua, seluruh kalimat dipandang sebagai argumen pertama.
-
$ 0 - perintah berjalan
Telah belajar tentang
$ 1
, orang bisa bertanya -tanya apa\ $ 0
variabel khusus tidak. Jika Anda berpikir tentang bagaimana sebuah perintah dibentuk (Command Argument1 Argument2
dll.), Anda mungkin memperhatikan caranyamemerintah
datang sebelum argumen pertama ($ 1
). Perintah, dengan cara tertentu, dengan demikian - secara visual -\ $ 0
, Dan inilah yang istimewa\ $ 0
Variabel berisi; perintah berjalan.$ echo \ $ 0 bash
Seperti yang bisa kita lihat, dan masuk akal, di baris perintah, perintah yang sedang berjalan adalah
pesta
. Jika kami menambahkanecho \ $ 0
Perintah ke skrip testest3.SH
dan menjalankan hal yang sama, kami mendapatkan:$ ./test3.SH ./test3.SH $… /Workspace /Test3.sh… /workspace /test3.SH
Seperti sekarang perintah yang sedang berjalan adalah
./test3.SH
, persis seperti yang dieksekusi dari baris perintah. Jika kita memulai perintah menggunakan nama jalur yang lebih panjang seperti… /Workspace /Test3.SH
sekali lagi ini diulang kembali melalui spesial\ $ 0
variabel.
Kesimpulan
Dalam artikel ini, kami menjelajahi $$
, $?
, $ 1, $ 2, dll.
, $*
Dan \ $ 0
variabel, cara kerjanya dan bagaimana Anda dapat menggunakannya baik secara langsung dari baris perintah atau dari dalam skrip. Ada beberapa variabel khusus lainnya, tetapi ini adalah variabel khusus utama dalam bash yang telah saya gunakan selama bertahun -tahun dengan pengkodean bash. Menikmati!
Tutorial Linux Terkait:
- Mengambil halaman web menggunakan wget, curl dan lynx
- Manipulasi data besar untuk kesenangan dan keuntungan bagian 1
- Manipulasi data besar untuk kesenangan dan keuntungan bagian 3
- Linux Complex Bash One-Liner Contoh
- Manipulasi data besar untuk kesenangan dan keuntungan bagian 2
- Loop bersarang dalam skrip bash
- Menguasai loop skrip bash
- Pengantar Otomatisasi Linux, Alat dan Teknik
- Mint 20: Lebih baik dari Ubuntu dan Microsoft Windows?
- Loop bash dengan contoh