GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana bash menguji 'false'?

Sintaks Shell sangat bergantung pada konteks. Artinya, hal yang khusus (seperti true atau false ) berarti sangat tergantung pada di mana itu terjadi. Dalam contoh Anda, false memiliki tiga arti yang sangat berbeda:perintah, nilai string, dan nama variabel (tidak ada) yang berisi nilai integer. Biarkan saya menelusuri contoh-contohnya:

  • false sebagai perintah:

    false; echo $?    # prints "1"
    if false; then echo "yep"; else echo "nope"; fi    # prints "nope"
    

    Ada perintah bernama "false" (umumnya /usr/bin/false, atau bash builtin yang melakukan hal yang sama) yang tidak benar-benar melakukan apa pun kecuali keluar dengan status gagal. Sebagai status keluar, nol menunjukkan keberhasilan (yang mirip dengan kebenaran) dan bukan nol menunjukkan kegagalan (yang mirip dengan salah). Ini kebalikan dari konvensi zero=false, nonzero=true yang lebih umum, tetapi untuk status keluar, ini lebih masuk akal.

  • false sebagai nilai string yang tidak diinterpretasikan:

    if [[ false ]]; then echo "yep"; else echo "nope"; fi     # prints "yep"
    if [[ true ]]; then echo "yep"; else echo "nope"; fi      # prints "yep"
    if [[ wibble ]]; then echo "yep"; else echo "nope"; fi    # prints "yep"
    if [[ "this is a string" ]]; then echo "yep"; else echo "nope"; fi    # prints "yep"
    [[ false ]]; echo $?    # prints "0" (=success)
    [ false ]; echo $?      # prints "0" (=success)
    test false; echo $?     # prints "0" (=success)
    

    Dalam semua kasus ini, perintah test atau sinonimnya [ atau ekspresi bersyarat bash [[ ]] tidak mendapatkan ekspresi, hanya satu string, jadi mereka melakukan tes yang sangat sederhana:apakah ini string dengan panjang bukan nol? "true", "false", "wibble", dll semuanya bukan nol, jadi perintah/ekspresinya seperti kebenaran, karenanya berhasil. Bandingkan dengan:

    [[ "" ]]; echo $?    # prints "1" (=failure), because the string is zero-length
    [[ ]]; echo $?       # prints "1" (=failure), because there isn't even a string
    [ ]; echo $?         # same
    

    Perhatikan bahwa test dan [ adalah perintah normal, dan "false" (dan "wibble" dll) hanyalah argumen untuk itu. [[ ]] adalah sedikit sintaks bash yang dapat digunakan sebagai pengganti perintah. Argumen/kontennya diuraikan secara berbeda dari nama perintah itu sendiri.

  • false sebagai kemungkinan nama variabel yang mungkin berisi bilangan bulat:

    if [[ false -eq true ]]; then echo "equal"; else echo "nope"; fi     # prints "equal"
    

    Yang ini agak aneh, dan bergantung pada detail bagaimana [[ ]] bash tes untuk kesetaraan numerik. Perhatikan bahwa di [[ ]] (dan [ ] dan test ekspresi), -eq pengujian persamaan numerik, dan = tes untuk persamaan string. Jadi misalnya, [[ 01 -eq 1 ]] (karena 1 dan 01 secara numerik sama) benar, tetapi [[ 01 = 1 ]] salah (karena bukan string yang sama). Dalam kasus [[ false -eq true ]] , "true" dan "false" bukan nilai integer, jadi bash mencoba mengonversinya menjadi integer dengan memperlakukannya sebagai nama variabel (dan berharap variabel berisi nilai integer). Faktanya, tidak ada yang didefinisikan sebagai variabel, jadi keduanya mengevaluasi ke string kosong, yang dapat diinterpretasikan sebagai bilangan bulat 0. Amati:

    if [[ false -eq true ]]; then echo "equal"; else echo "nope"; fi     # prints "equal"
    if [[ false -eq 0 ]]; then echo "equal"; else echo "nope"; fi        # prints "equal"
    false=5
    if [[ false -eq true ]]; then echo "equal"; else echo "nope"; fi     # now prints "nope"
    

    Perhatikan bahwa mendefinisikan false sebagai variabel tidak berpengaruh pada penggunaan lainnya; ketika digunakan sebagai perintah itu masih akan keluar dengan status 1, dan ketika digunakan sebagai string itu masih "false" (bukan "5").


Linux
  1. Bagaimana Cara Men-debug Skrip Bash?

  2. Bagaimana Menggemakan Bang!?

  3. Tujuan .bashrc Dan Bagaimana Cara Kerjanya?

  1. Bagaimana Bash Tahu Bagaimana Itu Dipanggil?

  2. Apa Arti -s Dan [[]] Dalam Kondisi If Di Bash?

  3. Apa yang Digema $? Mengerjakan??

  1. Cara menggemakan Baris Baru di Bash Shell Script

  2. Bagaimana cara menguji apakah suatu variabel adalah angka di Bash?

  3. Bagaimana cara kerja cat << EOF di bash?