2013-09-29 5 views
13

Esiste un elenco di tutte le opzioni if da utilizzare nello script bash? A volte vedo qualcuno che lo sta usando e mi chiedo quale sia l'interruttore che stanno usando.Elenco di "se" passa da qualche parte?

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

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

Qualsiasi riferimento, guida, posta, risposta sarebbe apprezzato.

+0

http://www.gnu.org/software/bash/manual/bashref.html –

+0

'[' è un nome breve per il comando 'test'. Prova "test uomo". – Barmar

+0

@Barmar intendi 'test di aiuto'. 'man test' è la documentazione di'/bin/test', e supporta diverse opzioni dal 'test' incorporato – SheetJS

risposta

18

Consultare la manpage di bash (man bash). Le opzioni sono specificate nella sezione CONDITIONAL EXPRESSIONS:

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 ... 

Viene 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 `['. 
+6

Manuale online: [Espressioni condizionali Bash] (http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html) –

2

In realtà non è il numero if che fornisce quelli - è [, meglio conosciuto con il nome di test. help test dovrebbe darti un elenco di tutte le opzioni che può assumere. Potresti anche dare un'occhiata a the standard, se ti interessa.

+1

-1: test è sia un comando '/ bin/test' che un builtin bash. 'man test' fornisce il doc per il comando, ma' ['è un sinonimo per il builtin. Come esempio di comportamento divergente, su OSX il builtin bash supporta il test '-N' ma'/bin/test' non fa – SheetJS

3

non sono interruttori per l'affermazione if, ma per il comando test ([ è sinonimo di test built-in). Vedi help test in bash per un elenco completo.

4

Sì. Questi sono chiamati conditional expressions e sono usati dallo [[compound command e dallo test e dallo [builtin commands ([ è semplicemente un sinonimo di test).

Leggere la sezione 6.4 Bash Conditional Expressions del Bash Reference Manual, che contiene un elenco di tutti questi interruttori e il loro utilizzo.

+0

Pagina singola: [6.4 Espressioni condizionali Bash] (http://www.gnu.org/ software/bash/manual/html_node/Bash-Conditional-Expressions.html) –

2

Le singole parentesi quadre ([ ... ]) è un sinonimo del comando test. Se guardate il manpage for test, vedrete quasi tutti (BASH potrebbe avere qualche extra in più non menzionato qui) dei vari se gli interruttori come li avete chiamati. Tutto in un posto facile da trovare.

Se si utilizzano doppie parentesi quadre ([[ ... ]]), si utilizza una serie di test BASH estesa. Questi hanno principalmente a che fare con la corrispondenza delle espressioni regolari e la corrispondenza globale (e la corrispondenza globale estesa se si dispone anche di tale serie). Per questo, dovrai leggere la manpage di BASH.

Li hai chiamati se gli interruttori, ma non è proprio corretto. Questi sono test e in realtà non hanno nulla a che fare con il comando if.

Il comando if semplicemente esegue il comando si dà, e poi se quel comando restituisce un codice di uscita di 0, verrà eseguito la parte if della dichiarazione if. In caso contrario, eseguirà la porzione else (se presente).sguardo

Let 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.. 

La dichiarazione if esegue il comando e il comando ls foo.test.txtls restituisce un non-zero in quanto il file non esiste. Ciò causa l'istruzione if per eseguire la clausola else.

Proviamo 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 comando ls restituito uno stato 0 uscita (dal momento che il file esiste ed esiste il file e può essere stat'ed dal comando ls.

Normalmente, non è necessario utilizzare il comando ls per verificare un file. Ho semplicemente usato qui per mostrare che l'istruzione if esegue il comando, quindi ha eseguito la clausola if o else a seconda dello stato di uscita di tale comando. Se si desidera verificare l'esistenza o meno di un file, è necessario utilizzare il comando test -e 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 restituirà uno stato di uscita di 0. In caso contrario, restituirà uno stato di uscita diverso da zero.

Se si esegue questa operazione:

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

Questo 10958 è la inode. I file con lo stesso inode sono due nomi diversi per lo stesso file. I comandi [ e test sono collegati in modo flessibile . Ciò significa che è possibile utilizzare al posto 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 in bash, non è in esecuzione o /bin/test/bin/[. Tuttavia, sono ancora collegati tra loro.

+0

'[' non è un alias del test. sinonimo è la parola usata dalla manpage. L'alias ha un significato specifico (nella manpage di bash, leggi la sezione 'ALIASES') – SheetJS

+0

Ok. Lo cambierò. Stavo semplicemente cercando una parola che spiegherebbe come i due sono collegati. –