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

MikeD
sumber
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.

qbi
sumber
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