GNU/Linux >> Znalost Linux >  >> Linux

Jak bash testuje „nepravdu“?

Syntaxe shellu je vysoce závislá na kontextu. To znamená, jaká konkrétní věc (například true nebo false ) znamená do značné míry závisí na tom, kde se vyskytuje. Ve vašich příkladech false má tři zcela odlišné významy:příkaz, řetězcová hodnota a (neexistující) název proměnné obsahující celočíselnou hodnotu. Dovolte mi projít si příklady:

  • false jako příkaz:

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

    Existuje příkaz s názvem "false" (obecně /usr/bin/false, nebo vestavěný bash, který dělá totéž), který ve skutečnosti nedělá nic kromě ukončení se stavem selhání. Jako výstupní stav nula znamená úspěch (což je něco jako pravda) a nenula znamená selhání (což je něco jako nepravda). Toto je opak obvyklejší konvence nula=nepravda, nenulová=pravda, ale pro výstupní stavy to dává větší smysl.

  • false jako neinterpretovaná řetězcová hodnota:

    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)
    

    Ve všech těchto případech příkaz test nebo jeho synonymum [ nebo bash podmíněný výraz [[ ]] nezískali výraz, pouze jeden řetězec, takže provedou velmi jednoduchý test:je to řetězec nenulové délky? „true“, „false“, „wibble“ atd. mají všechny nenulovou délku, takže příkaz/výraz je podobný pravdě, tudíž úspěšný. Porovnejte s:

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

    Všimněte si, že test a [ jsou normální příkazy a "false" (a "wibble" atd.) je pouze argumentem. [[ ]] je trochu bash syntaxe, kterou lze použít místo příkazu. Jejich argumenty/obsah jsou analyzovány odlišně od samotných názvů příkazů.

  • false jako možný název proměnné, který může obsahovat celé číslo:

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

    Tohle je trochu divnější a záleží na detailech toho, jak je bash [[ ]] testy na číselnou rovnost. Všimněte si, že v [[ ]] (a [ ] a test výrazy), -eq testy na číselnou rovnost a = testy na rovnost strun. Například [[ 01 -eq 1 ]] (protože 1 a 01 jsou číselně stejné) je pravda, ale [[ 01 = 1 ]] je false (protože se nejedná o stejný řetězec). V případě [[ false -eq true ]] , "true" a "false" nejsou celočíselné hodnoty, takže bash se je snaží převést na celá čísla tak, že s nimi zachází jako s názvy proměnných (a doufá, že proměnné obsahují celočíselné hodnoty). Ve skutečnosti ani jedna není definována jako proměnná, takže obě jsou vyhodnoceny jako prázdný řetězec, který lze tak nějak interpretovat jako celé číslo 0. Všimněte si:

    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"
    

    Všimněte si, že definování false jako proměnná nemá žádný vliv na její další použití; při použití jako příkaz bude stále ukončen se stavem 1 a při použití jako řetězec je stále jen "false" (ne "5").


Linux
  1. Jak napsat smyčku v Bash

  2. Jak provádět celočíselné a plovoucí výpočty v Bash nebo jiných jazycích/rámcích?

  3. Má Running „exec Echo Some; Echo Test“ V Bash Nikdy netisknout „nějaký test“?

  1. Jak zopakovat nový řádek ve skriptech Bash Shell

  2. Jak otestuji, zda je proměnná číslo v Bash?

  3. Jak mohu otestovat svůj Bash skript na starších verzích Bash?

  1. Jak ladit Bash skript?

  2. How To Echo A Bang!?

  3. Účel .bashrc a jak to funguje?