GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Bash Mengevaluasi Kode Berikut?

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.

Terkait:Mac – Bagaimana mengatur bash paket macports untuk digunakan dari terminal.app?

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.


Linux
  1. Bagaimana Cara Men-debug Skrip Bash?

  2. Bagaimana Cara Mencari Kode Keluar Untuk Aplikasi?

  3. Cara Keluar dari Kontainer Docker

  1. Bagaimana Mengevaluasi String sebagai Angka di Bash

  2. Apa itu Kode Keluar Bash di Linux

  3. Bagaimana cara keluar jika perintah gagal?

  1. Cara mendapatkan status keluar satu lingkaran di bash

  2. Bash Prompt dengan Kode Keluar Terakhir

  3. Keluar dari kode penugasan variabel ke substitusi perintah di Bash