Elenco di ‘se’ passa ovunque?

C’è un elenco di tutti i if interruttori per l’uso in bash scripting? A volte vedo qualcuno e mi chiedo che cosa l’interruttore si utilizza effettivamente.

Esempio è il -z in questo. So come usarlo, ma non so dove è stato derivato da.

if [ -z "$BASH_VERSION" ]; then
    echo -e "Error: this script requires the BASH shell!"
    exit 1
fi

Qualsiasi riferimento, guide, articoli, answers sarebbe apprezzato.

  • gnu.org/software/bash/manual/bashref.html
  • [ è un nome breve per il test comando. Provare man test.
  • vuoi dire help test. man test è la documentazione per /bin/test, e supporta diverse opzioni da test builtin
  • ffs basta eseguire man [!
  • -z è un’opzione per [ o test; non ha nulla a che (direttamente) da fare con if.

 

5 Replies
  1. 32

    Occhiata al man di bash (man bash). Le opzioni sono specificate nel CONDITIONAL EXPRESSIONS sezione:

    CONDITIONAL EXPRESSIONS
           Conditional expressions are used by the [[  compound  command  and  the
           test  and [ builtin commands to test file attributes and perform string
           and arithmetic comparisons.  Expressions are formed from the  following
           unary  or  binary  primaries.   If any file argument to one of the pri-
           maries is of the form /dev/fd/n, then file descriptor n is checked.  If
           the  file  argument  to  one  of  the  primaries  is one of /dev/stdin,
           /dev/stdout, or /dev/stderr, file descriptor 0, 1, or 2,  respectively,
           is checked.
    
           Unless otherwise specified, primaries that operate on files follow sym-
           bolic links and operate on the target of the link, rather than the link
           itself.
    
           -a file
                  True if file exists.
           ... more options ...

    È anche spiegato nella guida:

    $ help [ [: [ arg... ]
        This is a synonym for the "test" builtin, but the last
        argument must be a literal `]', to match the opening `['.
  2. 5

    Non sono gli interruttori per l’ if istruzione, ma per il test comando ([ è un sinonimo per la test builtin). Vedere help test in bash per un elenco completo.

  3. 3

    È in realtà non if fornire quelle — è [, meglio conosciuto con il nome di test. help test dovrebbe dare un elenco di tutte le opzioni si può prendere. Si potrebbe anche guardare standard, se vi interessa.

    • -1: il test è sia un comando /bin/test e un comando interno di bash. man test ti dà la doc per il comando, ma [ è un sinonimo per la builtin. Come esempio di comportamento divergente, su OSX bash incorporato supporta la -N prova ma il /bin/test non
  4. 3

    L’unica parentesi quadre ([ ... ]) è un sinonimo di test comando. Se si guarda il manuale per test, vedrete quasi tutti (BASH potrebbe avere un qualche extra non menzionati qui) dei vari se passa come li ha chiamati. Il tutto in uno facile trovare posto.

    Se si utilizza doppie parentesi quadre ([[ ... ]]), si utilizza un esteso BASH serie di test. Questi principalmente a che fare con espressioni regolari, e glob corrispondenza (e estesa glob di corrispondenza, se avete troppo). Per questo, dovrete leggere che man di BASH.

    È chiamato se passa, ma non è molto corretto. Questi sono test e davvero non hanno nulla a che fare con il if comando.

    Il if comando semplicemente esegue il comando da dare, e quindi se il comando restituisce un codice di uscita 0, sarà il if porzione di if istruzione. In caso contrario, eseguire il else parte (se presente).

    Diamo un’occhiata a questo:

    $ rm foo.test.txt   # Hope this wasn't an important file
    $ if ls foo.test.txt
    > then
    > echo "This file exists"
    > else
    > echo "I can't find it anywhere.."
    > fi
    ls: foo.test.txt: No such file or directory
    I can't find it anywhere..

    Il if istruzione esegue la ls foo.test.txt comando e il ls comando restituisce un valore non-zero in quanto il file non esiste. Questo provoca la if istruzione da eseguire il else clausola.

    Proviamo a farlo di nuovo…

    $ touch foo.test.txt   # Now this file exists.
    $ if ls foo.test.txt   # Same "if/else" statement as above
    > then
    > echo "This file exists"
    > else
    > echo "I can't find it anywhere.."
    > fi
    foo.test.txt
    This file exists

    Qui, il ls comando ha restituito un 0 stato di uscita (dato che il file esista e che il file esista e che sia stat autenticata dal ls comando.

    Normalmente, non si deve usare il ls comando per il test di un file. Io ho semplicemente usato per mostrare che il if istruzione esegue il comando, quindi eseguito il if o else clausola a seconda lo stato di uscita del comando. Se si desidera verificare se un file esiste, si deve utilizzare il test -e comando invece di ls comando:

    if test -e foo.test.txt  # Same as above, but using "test" instead of "ls"
    then
        echo "This file exists"
    else
        echo "I can't find it anywhere.."
    fi

    Se il file esiste, test -e tornerà stato di uscita di 0. In caso contrario, verrà restituito un non-stato di uscita zero.

    Se si esegue questa operazione:

    $ ls -i /bin/test /bin/[
    10958 /bin/[    10958 /bin/test

    Che 10958 è il inode. I file con lo stesso inode sono due nomi diversi per lo stesso file. Così [ e test comando sono morbidi collegati1. Questo significa che è possibile utilizzare [ invece di test:

    if [ -e foo.test.txt ]
    then
        echo "This file exists"
    else
        echo "I can't find it anywhere.."
    fi

    Sembra familiare?


    1. In BASH, il test e [ sono builtin, in modo che quando si esegue questi comandi BASH, non è in esecuzione /bin/test o /bin/[. Tuttavia, sono ancora collegati a vicenda.

    • [ non è un alias di test. sinonimo è la parola il manuale utilizza. Alias ha un significato specifico (in bash man, leggere la sezione ALIASES)
    • Va bene. Mi cambierà. Ero semplicemente alla ricerca di una parola che si spiega come i due sono collegati.

Lascia un commento