Saya ingin menulis fungsi bash yang memeriksa apakah file memiliki properti tertentu dan mengembalikan benar atau salah. Maka saya bisa menggunakannya dalam skrip saya di "jika". Tetapi apa yang harus saya kembalikan?
function myfun(){ ... return 0; else return 1; fi;}
maka saya menggunakannya seperti ini:
if myfun filename.txt; then ...
tentu saja ini tidak berhasil. Bagaimana ini bisa dicapai?
function
kata kunci,myfun() {...}
cukupif
adalah status nol-keluar darimyfun
: jikamyfun
keluar dengan0
,then ...
dieksekusi; jika adaelse ...
yang dieksekusi.function
kata kunci adalah bashism, dan akan menyebabkan kesalahan sintaksis pada beberapa shell lainnya. Pada dasarnya, itu tidak perlu atau dilarang, jadi mengapa menggunakannya? Itu bahkan tidak berguna sebagai target grep, karena mungkin tidak ada di sana (()
bukan grep ).Jawaban:
Gunakan 0 untuk true dan 1 untuk false.
Sampel:
Edit
Dari komentar @ amichair, ini juga mungkin
sumber
[ -d "$1" ]
.Mengapa Anda harus peduli dengan apa yang saya katakan walaupun ada 250+ jawaban yang mendukung
Bukan itu
0 = true
dan1 = false
. Yaitu: nol berarti tidak ada kegagalan (sukses) dan bukan nol berarti gagal (tipe N) .Sementara jawaban yang dipilih secara teknis "benar" tolong jangan cantumkan
return 1
** pada kode Anda untuk salah . Ini akan memiliki beberapa efek samping yang tidak menguntungkan.Pelajari beberapa bash
The bash manual mengatakan (penekanan)
Karena itu, kita tidak perlu menggunakan 0 dan 1 untuk menunjukkan Benar dan Salah. Fakta bahwa mereka melakukannya pada dasarnya pengetahuan sepele yang hanya berguna untuk debugging kode, pertanyaan wawancara, dan meniup pikiran pemula.
Manual bash juga mengatakan
Manual bash juga mengatakan
Tunggu sebentar. Pipa? Mari kita beralih ke manual bash sekali lagi.
Iya. Mereka mengatakan 1 perintah adalah sebuah pipa. Karena itu, ketiga kutipan tersebut mengatakan hal yang sama.
$?
memberi tahu Anda apa yang terjadi terakhir.Jawabanku
Jadi, sementara @Kambus menunjukkan hal itu dengan fungsi yang begitu sederhana, tidak
return
diperlukan sama sekali. Saya pikir itu sangat sederhana dibandingkan dengan kebutuhan kebanyakan orang yang akan membaca ini.Mengapa
return
?Jika suatu fungsi akan mengembalikan status keluar perintah terakhirnya, mengapa digunakan
return
? Karena itu menyebabkan fungsi untuk berhenti mengeksekusi.Hentikan eksekusi dalam berbagai kondisi
Apa yang kita miliki di sini adalah ...
Line
04
adalah [-ish] eksplisit yang mengembalikan true karena RHS&&
hanya dieksekusi jika LHS benarLine
09
mengembalikan true atau false yang cocok dengan status baris08
Baris
13
mengembalikan false karena garis12
(Ya, ini bisa diturunkan, tetapi seluruh contoh dibuat-buat.)
Pola umum lainnya
Perhatikan bagaimana pengaturan
status
variabel demistifikasi makna$?
. (Tentu saja Anda tahu apa$?
artinya, tetapi seseorang yang kurang berpengetahuan daripada Anda harus Google itu suatu hari nanti. Kecuali jika kode Anda melakukan perdagangan frekuensi tinggi, tunjukkan cinta , tentukan variabelnya.) Tetapi kesimpulan sebenarnya adalah bahwa "jika tidak ada status "atau sebaliknya" jika status keluar "dapat dibacakan dengan lantang dan jelaskan artinya. Namun, yang terakhir mungkin agak terlalu ambisius karena melihat kata ituexit
mungkin membuat Anda berpikir itu keluar dari skrip, padahal kenyataannya keluar dari$(...)
subkulit.** Jika Anda benar-benar bersikeras menggunakan
return 1
untuk false, saya sarankan setidaknya Anda gunakanreturn 255
sebagai gantinya. Ini akan menyebabkan diri Anda di masa depan, atau pengembang lain yang harus menjaga kode Anda mempertanyakan "mengapa itu 255?" Maka mereka setidaknya akan memperhatikan dan memiliki kesempatan yang lebih baik untuk menghindari kesalahan.sumber
if
sukses lakukan ini,else
lakukan itu." Sukses apa? Bisa jadi memeriksa benar / salah, bisa memeriksa string, integer, file, direktori, izin menulis, glob, regex, grep, atau perintah lain yang mengalami kegagalan .true
danfalse
perintah. Artinya, kata kuncitrue
secara harfiah mengevaluasi ke kode status 0. Selain itu, pernyataan if-then secara alami beroperasi pada boolean, bukan kode keberhasilan. Jika kesalahan terjadi selama operasi boolean, itu seharusnya tidak mengembalikan benar atau salah tetapi hanya menghentikan eksekusi. Kalau tidak, Anda mendapatkan false positive (permainan kata-kata).return 1
harus dihindari. Dengan asumsi saya memilikivalidate
fungsi, saya merasa masuk akalreturn 1
jika validasi gagal. Bagaimanapun, itu adalah alasan untuk menghentikan eksekusi skrip jika tidak ditangani dengan benar (misalnya, ketika menggunakanset -e
).return 1
valid. Perhatian saya adalah semua komentar di sini yang mengatakan “0 = benar 1 = salah adalah [masukkan kata negatif]”. Orang-orang itu mungkin akan membaca kode Anda suatu hari nanti. Jadi bagi mereka melihatreturn 255
(atau 42 atau bahkan 2) harus membantu mereka lebih memikirkannya dan tidak menganggapnya “benar”.set -e
masih akan menangkapnya.sumber
Hati-hati saat memeriksa direktori hanya dengan opsi -d!
jika variabel $ 1 kosong, cek masih akan berhasil. Yang pasti, periksa juga bahwa variabel tidak kosong.
sumber
$1
("$1"
) maka Anda tidak perlu memeriksa variabel kosong. The[[ -d "$1" ]]
akan gagal karena ini""
bukan sebuah direktori.Saya menemukan titik (belum disebutkan secara eksplisit?) Yang saya tersandung. Artinya, bukan bagaimana mengembalikan boolean, melainkan bagaimana cara mengevaluasinya dengan benar!
Saya mencoba mengatakannya
if [ myfunc ]; then ...
, tetapi itu salah. Anda tidak harus menggunakan tanda kurung!if myfunc; then ...
adalah cara untuk melakukannya.Seperti di @Bruno dan yang lainnya menegaskan,
true
danfalse
merupakan perintah , bukan nilai! Itu sangat penting untuk memahami boolean dalam skrip shell.Dalam posting ini, saya menjelaskan dan melakukan demo menggunakan variabel boolean : https://stackoverflow.com/a/55174008/3220983 . Saya sangat menyarankan memeriksa itu, karena sangat erat hubungannya.
Di sini, saya akan memberikan beberapa contoh pengembalian dan evaluasi boolean dari fungsi:
Ini:
Tidak menghasilkan output gema. (mis.
false
mengembalikan false)Menghasilkan:
(yaitu
true
mengembalikan true)Dan
Menghasilkan:
Karena 0 (yaitu benar) dikembalikan secara implisit .
Sekarang, inilah yang mengacaukan saya ...
Menghasilkan:
DAN
JUGA menghasilkan:
Menggunakan tanda kurung di sini menghasilkan false positive ! (Saya menyimpulkan hasil perintah "luar" adalah 0.)
Pengambilan utama dari posting saya adalah: jangan gunakan tanda kurung untuk mengevaluasi fungsi boolean (atau variabel) seperti yang Anda lakukan untuk pemeriksaan kesetaraan tipikal misalnya
if [ x -eq 1 ]; then...
!sumber
Gunakan perintah
true
ataufalse
segera sebelum Andareturn
, makareturn
tanpa parameter. Thereturn
otomatis akan menggunakan nilai perintah terakhir Anda.Memberikan argumen
return
tidak konsisten, spesifik jenis dan cenderung kesalahan jika Anda tidak menggunakan 1 atau 0. Dan seperti komentar sebelumnya, menggunakan 1 atau 0 di sini bukan cara yang tepat untuk mendekati fungsi ini.Keluaran:
sumber
Mungkin berhasil jika Anda menulis ulang ini
function myfun(){ ... return 0; else return 1; fi;}
sebagai inifunction myfun(){ ... return; else false; fi;}
. Itu adalah jikafalse
adalah instruksi terakhir dalam fungsi Anda mendapatkan hasil yang salah untuk seluruh fungsi tetapireturn
mengganggu fungsi dengan hasil yang sebenarnya. Saya percaya setidaknya benar untuk penerjemah bash saya.sumber
Saya menemukan bentuk terpendek untuk menguji fungsi keluarannya secara sederhana
sumber
Untuk alasan keterbacaan kode, saya yakin mengembalikan benar / salah harus:
return
diikuti oleh kata kunci lain (true
ataufalse
)Solusi saya adalah
return $(true)
ataureturn $(false)
seperti yang ditunjukkan:sumber
Menindaklanjuti @Bruno Bronosky dan @mrteatime, saya menawarkan saran bahwa Anda hanya menulis boolean return "mundur". Inilah yang saya maksud:
Itu menghilangkan persyaratan dua baris jelek untuk setiap pernyataan kembali.
sumber