Tampaknya ada beberapa kesalahpahaman di sini tentang Bash builtin true
, dan lebih khusus lagi, tentang bagaimana Bash memperluas dan menafsirkan ekspresi di dalam tanda kurung.
Kode dalam jawaban miku sama sekali tidak ada hubungannya dengan Bash builtin true
, atau /bin/true
, atau rasa true
perintah lainnya. Dalam hal ini, true
tidak lebih dari string karakter sederhana, dan tidak ada panggilan ke true
perintah / builtin yang pernah dibuat, baik oleh penugasan variabel, maupun dengan evaluasi ekspresi kondisional.
Kode berikut secara fungsional identik dengan kode dalam jawaban miku:
the_world_is_flat=yeah
if [ "$the_world_is_flat" = yeah ]; then
echo 'Be careful not to fall off!'
fi
Satu- satunya perbedaan di sini adalah bahwa empat karakter yang dibandingkan adalah 'y', 'e', 'a', dan 'h' bukannya 't', 'r', 'u', dan 'e'. Itu dia. Tidak ada upaya yang dilakukan untuk memanggil perintah atau builtin bernama yeah
, juga tidak ada (dalam contoh miku) segala jenis penanganan khusus terjadi ketika Bash mem-parsing token true
. Itu hanya string, dan sepenuhnya arbitrer.
Pembaruan (2014-02-19): Setelah mengikuti tautan dalam jawaban miku, sekarang saya melihat dari mana beberapa kebingungan itu berasal. Jawaban Miku menggunakan tanda kurung tunggal, tetapi cuplikan kode yang ditautkannya tidak menggunakan tanda kurung. Hanya saja:
the_world_is_flat=true
if $the_world_is_flat; then
echo 'Be careful not to fall off!'
fi
Kedua potongan kode akan berperilaku dengan cara yang sama, tetapi tanda kurung sepenuhnya mengubah apa yang terjadi di bawah tenda.
Inilah yang dilakukan Bash dalam setiap kasus:
Tidak ada tanda kurung:
- Perluas variabel
$the_world_is_flat
ke string "true"
.
- Coba parsing string
"true"
sebagai perintah.
- Temukan dan jalankan
true
perintah (baik builtin atau /bin/true
, tergantung pada versi Bash).
- Bandingkan kode keluar dari
true
perintah (yang selalu 0) dengan 0. Ingat bahwa di sebagian besar shell, kode keluar 0 menunjukkan keberhasilan dan yang lainnya menunjukkan kegagalan.
- Karena kode keluar adalah 0 (berhasil), jalankan klausa
if
pernyataan ituthen
Kurung:
- Perluas variabel
$the_world_is_flat
ke string "true"
.
- Mengurai ekspresi bersyarat yang sekarang sepenuhnya diperluas, yang merupakan bentuk
string1 = string2
. The =
operator adalah bash perbandingan string operator. Begitu...
- Lakukan perbandingan string pada
"true"
dan "true"
.
- Yap, kedua string itu sama, sehingga nilai kondisionalnya benar.
- Jalankan klausa
if
pernyataan itu then
.
Kode tanpa kurung berfungsi, karena true
perintah mengembalikan kode keluar 0, yang menunjukkan keberhasilan. Kode kurung berfungsi, karena nilai $the_world_is_flat
identik dengan string literal true
di sisi kanan =
.
Hanya untuk mengarahkan titik awal, pertimbangkan dua cuplikan kode berikut:
Kode ini (jika dijalankan dengan hak akses root) akan me-reboot komputer Anda:
var=reboot
if $var; then
echo 'Muahahaha! You are going down!'
fi
Kode ini hanya mencetak "Usaha yang bagus." Perintah reboot tidak dipanggil.
var=reboot
if [ $var ]; then
echo 'Nice try.'
fi
Pembaruan (2014-04-14) Untuk menjawab pertanyaan dalam komentar mengenai perbedaan antara =
dan ==
: AFAIK, tidak ada perbedaan. The ==
operator adalah sinonim Bash-spesifik untuk =
, dan sejauh yang saya telah melihat, mereka bekerja persis sama dalam semua konteks.
Catatan, bagaimanapun, bahwa aku secara khusus berbicara tentang =
dan ==
operator perbandingan string digunakan baik [ ]
atau [[ ]]
tes. Saya tidak menyarankan itu =
dan ==
dapat dipertukarkan di mana-mana di bash.
Misalnya, Anda jelas tidak dapat melakukan penugasan variabel ==
, seperti var=="foo"
(baik secara teknis Anda dapat melakukan ini, tetapi nilainya var
akan "=foo"
, karena Bash tidak melihat ==
operator di sini, itu melihat =
operator (penugasan), diikuti oleh nilai literal ="foo"
, yang baru saja menjadi "=foo"
).
Juga, meskipun =
dan ==
dapat dipertukarkan, Anda harus ingat bahwa cara kerja tes-tes itu bergantung pada apakah Anda menggunakannya di dalam [ ]
atau [[ ]]
, dan juga pada apakah operan dikutip atau tidak. Anda dapat membaca lebih lanjut tentang itu di Panduan Skrip Bash Lanjutan: 7.3 Operator Perbandingan Lainnya (gulir ke bawah ke diskusi tentang =
dan ==
).
true
danfalse
dalam konteks yang paling potongan di bawah ini hanya string polos, tidak yangbash built-ins
!!! Silakan baca jawaban Mike Holt di bawah ini. (Ini adalah salah satu contoh di mana jawaban yang sangat dipilih dan diterima adalah IMHO membingungkan dan membayangi konten wawasan dalam jawaban yang lebih rendah)