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.txt
ls
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.
http://www.gnu.org/software/bash/manual/bashref.html –
'[' è un nome breve per il comando 'test'. Prova "test uomo". – Barmar
@Barmar intendi 'test di aiuto'. 'man test' è la documentazione di'/bin/test', e supporta diverse opzioni dal 'test' incorporato – SheetJS