Pernah belajar bash minggu ini dan berlari ke sebuah halangan.
#!/bin/sh
if [ false ]; then
echo "True"
else
echo "False"
fi
Ini akan selalu output yang Benar meskipun kondisi ini tampaknya untuk menunjukkan sebaliknya. Jika saya menghapus tanda kurung siku []
kemudian ia bekerja, tapi aku tidak mengerti mengapa.
Anda menjalankan [
(alias test
) perintah dengan argumen "salah", tidak menjalankan perintah palsu
. Sejak "salah" adalah non-string kosong, test
perintah selalu berhasil. Untuk benar-benar menjalankan perintah, drop [
perintah.
if false; then
echo "True"
else
echo "False"
fi
Jika
pernyataan mengambil perintah sebagai argumen (seperti yang dilakukan &&
, ||
, dll.). Hasil integer kode perintah ditafsirkan sebagai boolean (0/null=true, 1/lain=false).
Test
pernyataan membutuhkan operator dan operand sebagai argumen dan mengembalikan kode hasil dalam format yang sama seperti jika
. Alias dari test
pernyataan [
, yang sering digunakan dengan jika
untuk melakukan yang lebih kompleks perbandingan.
Benar
dan salah
pernyataan melakukan apa-apa dan kembali hasil kode (0 dan 1, masing-masing). Sehingga mereka dapat digunakan sebagai boolean literals dalam Bash. Tetapi jika anda menempatkan pernyataan-pernyataan di tempat di mana mereka're diinterpretasikan sebagai string, you'll mengalami masalah. Dalam kasus anda:
if [ foo ]; then ... # "if the string 'foo' is non-empty, return true"
if foo; then ... # "if the command foo succeeds, return true"
Jadi:
if [ true ] ; then echo "This text will always appear." ; fi;
if [ false ] ; then echo "This text will always appear." ; fi;
if true ; then echo "This text will always appear." ; fi;
if false ; then echo "This text will never appear." ; fi;
Ini adalah sama untuk melakukan sesuatu seperti echo '$foo'
vs echo "$foo"
.
Ketika menggunakan test
pernyataan, hasilnya tergantung pada operator yang digunakan.
if [ "$foo" = "$bar" ] # true if the string values of $foo and $bar are equal
if [ "$foo" -eq "$bar" ] # true if the integer values of $foo and $bar are equal
if [ -f "$foo" ] # true if $foo is a file that exists (by path)
if [ "$foo" ] # true if $foo evaluates to a non-empty string
if foo # true if foo, as a command/subroutine,
# evaluates to true/success (returns 0 or null)
Pendek, jika anda hanya ingin menguji sesuatu seperti lulus/gagal (alias "benar"/"salah"), kemudian melewati perintah untuk jika
atau &&
dll. pernyataan, tanpa tanda kurung. Untuk kompleks perbandingan, gunakan tanda kurung dengan tepat operator.
Dan ya, aku'm sadar ada's ada hal seperti asli boolean tipe di Bash, dan bahwa jika
dan [
dan benar
secara teknis "perintah" dan "pernyataan"; ini adalah sangat dasar, fungsional penjelasan.
Menggunakan true/false menghilangkan beberapa braket kekacauan...
#! /bin/bash
# true_or_false.bash
[ "$(basename $0)" == "bash" ] && sourced=true || sourced=false
$sourced && echo "SOURCED"
$sourced || echo "CALLED"
# Just an alternate way:
! $sourced && echo "CALLED " || echo "SOURCED"
$sourced && return || exit