Pertanyaan ini memiliki dua bagian:
(a) Memahami apa yang dilakukan kode yang dipotong
(b) Memahami perbedaan antara status keluar dan mengembalikan status dalam konteks bash
.
Berikut ini potongan kode yang saya coba pahami:
if var=-2 && (( var+=2 ))
then
echo "True"
else
echo "False"
fi
Menjalankan ini menghasilkan False
. Saya tidak mengerti mengapa ini terjadi.
Jika saya memahami ini dengan benar, inilah yang mungkin terjadi dengan if
kondisi:
(a) var=-2
membuat status keluar 0, karena penugasan berhasil
(b) (( var+=2 ))
menambahkan 2 ke nilai var
dan ekspresi mengevaluasi nol. Jadi status keluarnya adalah 1 untuk istilah ini
(c) 0 &&1 membuat status 0 yang ada yang kemudian digunakan oleh if
membangun
if
konstruksi seharusnya hanya memeriksa status keluar dan ketika nol dibutuhkan lalu jalur. Pada langkah (c) di atas nol tetapi skrip masih menggunakan lain jalur. Apakah ini cara yang benar untuk memahami ini?
Juga, saya terus melihat berbagai bash
teks menggunakan status keluar dan mengembalikan status secara bergantian.
Saya ragu var=-2
penugasan akan memiliki status keluar apa pun karena ini bukan program. Tetapi klarifikasi apa pun tentang perbedaan antara keduanya akan sangat bagus.
Jawaban yang Diterima:
Yaitu:
if
first list of commands
then
second list of commands
else
third list of commands
fi
Itu untuk menjalankan daftar perintah kedua jika daftar perintah pertama kembali dengan true /sukses (nol) status keluar, yaitu jika perintah run terakhir di sana kembali dengan status keluar nol.
Dalam:
var=-2 && ((var += 2))
Ini cmd1 && cmd2
dimana cmd2
hanya dijalankan jika cmd1
berhasil.
var=-2
Biasanya akan berhasil selama $var
belum dibuat read-only, jadi ((var += 2))
perintah akan dijalankan:
((arithmetic expression))
Mengembalikan sukses /benar selama ekspresi dievaluasi dengan benar (tidak ada kesalahan sintaks) dan hasil ekspresi bukan nol.
((123))
,((1 + 1))
,((1 == 1))
kembali benar((0))
,((-2 + 2))
,((2 == -2))
kembali salah.((4294967296 * 4294967296))
mengembalikan false di sebagian besar shell karena pembungkus bilangan bulat 64 bit
var += 2
sebagai ekspresi aritmatika, melakukan tugas dan menyelesaikan nilai yang diberikan, di sini 0, karenanya salah status keluar.
Anda dapat melihat nilai yang menjadi dasar status keluar, dengan menggunakan $((...))
sintaks ekspansi aritmatika:
$ echo "$((1 + 1)) $((2 == 2)) $((2 == -2)) $((var = -2)) $((var += 2))"
2 1 0 -2 0
Atau menugaskannya ke variabel:
$ var=-2; ((result = (var += 2)))
$ echo "$? $result $var"
1 0 0
$?
berisi status keluar dari perintah sebelumnya. Sejauh if
/then
/else
/fi
yang bersangkutan, 0 berarti benar, yang lainnya berarti salah.
Kebingungan di sini berasal dari fakta bahwa untuk ekspresi aritmatika, sebaliknya: berarti salah dan yang lainnya berarti benar (misalnya,
2 == 2
adalah 1
sedangkan 2 < 1
adalah ).
Untuk menghindari kekhawatiran tentang perbedaannya, lupakan saja $?
dan kemungkinan nilainya. Pikirkan saja dalam istilah boolean benar /salah , sukses /gagal .
grep -q foo file
Mengembalikan nilai true jika foo
ditemukan di file
.
[ "$a" = "$b" ]
Mengembalikan nilai true jika $a
berisi hal yang sama dengan $b
.
((6 * 3 - 12))
((4 == 1))
Mengembalikan nilai true jika hasil ekspresi aritmatika adalah bilangan bukan nol.
Tidak masalah apakah itu benar /salah dinyatakan dalam 0 atau 1 status keluar dari grep
. tersebut /[
perintah atau ((...))
konstruksi.