Operator perbandingan dan ekspresi Bash


11

Saya baru mengenal pemrograman bash. Saya telah membaca dua panduan yang bagus dan panjang, tetapi mereka membuat kekacauan di kepala saya tentang operator dan kata kunci.

Mana yang lebih umum dan banyak digunakan? Saya tidak tahu kapan harus menggunakan yang mana dan mengapa.

  1. test, [[ ]]Atau [ ]bahkan(( ))
  2. $((exp)) atau $[exp]
  3. -gtatau >, geatau lainnya >=.
  4. kapan harus menggunakan <dan >atau ( )kapan kita harus menghindarinya dengan \: \< \(dll.
  5. ==atau =(perbandingan string)

Saya tahu perbedaan mendasar antara [dan [[tetapi pertanyaan lain adalah misteri bagi saya.

Terima kasih sebelumnya


2
Wiki yang sangat berguna yang terkini dan menyebutkan banyak praktik yang baik adalah wiki Greg . Panduan Bash dan FAQ di sana sangat berguna.

Jawaban:


5
  • testadalah shell built-in yang (jelas) menguji beberapa kondisi tertentu. Beberapa cangkang yang lebih tua membutuhkan perintah khusus. Jadi, Anda juga akan menemukan program di /usr/bin/test.
  • [juga merupakan program untuk menguji beberapa kondisi. Perangkat lunak ini juga memerlukan braket penutup dan Anda dapat menemukannya di /usr/bin/[.
  • [[…]]adalah alternatif untuk testdan [. Ini dikembangkan untuk shell Korn ( ksh). Tapi Anda juga menemukannya dalam versi Bash lebih besar dari 2 dan di Z Shell. Kurung ganda memiliki beberapa fitur bagus:
    • Shell tidak melakukan pemisahan kata atau perluasan nama file.
    • Anda tidak perlu mengutip.
    • Alih-alih -a(DAN) atau -o(ATAU) Anda dapat menggunakan &&atau ||.
    • The =dapat melakukan lebih banyak lagi.
  • ((…))setara dengan let. Jadi pada dasarnya ((expression))sama dengan let "expression". Namun dengan letAnda dapat menggunakan lebih dari satu ekspresi, tetapi kurung ganda hanya memungkinkan satu ekspresi.
  • $((…))(dan juga $[…]) melakukan perhitungan. Anda shell mencoba untuk menghitung ekspresi di dalam kurung dan mengganti ekspresi dengan hasilnya. Jadi echo $((1+1))mengarah ke echo 2. Jadi cangkang Anda mencetak angka 2.

Setiap kali Anda ingin membandingkan dua angka, Anda harus menggunakan opsi dengan tanda hubung dan dua huruf ( -ge, -ltdll.). Jika Anda ingin membandingkan string, Anda harus menggunakan =atau !=.

Pertanyaan Anda tentang melarikan diri cukup sulit dijawab. Karena itu tergantung pada perangkat lunak yang Anda gunakan selain dari shell. Jadi yaitu grepdan grep -Eperlu pelarian yang berbeda. Ini juga halnya dengan sed, awkdan lainnya. Jadi pilihan terbaik adalah dengan melihat halaman manualnya. Setelah beberapa waktu Anda terbiasa dan tahu kapan harus melarikan diri.


Terima kasih. satu pertanyaan lagi - karena dimungkinkan untuk melakukan perbandingan menggunakan ((...)) - apakah lebih umum menggunakan versi ini: if ((2> 1)) ATAU ini: if [[2 -gt 1]]
MikeD

Saya akan menganggap itu if [ 2 -gt 1 ]; …lebih umum, karena saya melihat ini lebih sering di skrip shell dan sejauh yang saya tahu ini sesuai dengan POSIX.
qbi

Hal lain yang perlu diingat adalah bahwa [ekspresi] benar jika ekspresi mengevaluasi ke / mengembalikan nol, tetapi ((ekspresi)) benar jika ekspresi mengevaluasi ke / mengembalikan bukan-nol.
Joe
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.