web-dev-qa-db-fra.com

Liste des commutateurs «si» n'importe où?

Existe-t-il une liste de tous les commutateurs if à utiliser dans les scripts bash? Parfois, je vois quelqu'un l'utiliser et je me demande ce que fait réellement le commutateur qu'ils utilisent.

L'exemple est le -z dans celui-ci. Je sais comment l'utiliser, mais je ne sais pas d'où il provient.

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

Toutes références, guides, articles, réponses seraient appréciés.

30
Danijel-James W

Regardez la page de manuel bash (man bash). Les options sont spécifiées dans le CONDITIONAL EXPRESSIONS section:

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

Il est également expliqué dans l'aide:

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

Oui. Celles-ci sont appelées ( expressions conditionnelles et elles sont utilisées par le [[ commande composée et les test et [ commandes intégrées ([ est simplement un synonyme de test).

Lisez la section 6.4 Expressions conditionnelles Bash du Manuel de référence Bash , qui contient une liste de tous ces commutateurs et leur utilisation.

10
Johnsyweb

Ce ne sont pas des commutateurs pour l'instruction if, mais pour la commande test ([ est un synonyme du test intégré). Voir help test en bash pour une liste complète.

5
Dolda2000

Les crochets simples ([ ... ]) est un synonyme de la commande test. Si vous regardez la page de manuel pour le test , vous verrez presque tous (BASH peut en avoir quelques-uns non mentionnés ici) des divers si commutateurs comme vous les appeliez. Tout en un endroit facile à trouver.

Si vous utilisez des crochets doubles ([[ ... ]]), vous utilisez un ensemble de tests BASH étendu. Cela concerne principalement la correspondance d'expressions régulières et la correspondance de glob (et la correspondance de glob étendue si vous l'avez également définie). Pour cela, vous devrez lire cette page de manuel BASH.

Vous les avez appelés if commutateurs , mais ce n'est pas vraiment correct. Ce sont des tests et n'ont vraiment rien à voir avec la commande if.

La commande if exécute simplement la commande que vous lui donnez, puis si cette commande renvoie un code de sortie de 0, exécutera la partie if de l'instruction if. Sinon, il exécutera la partie else (si elle est présente).

Regardons ceci:

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

L'instruction if exécute le ls foo.test.txt et la commande ls renvoient une valeur non nulle car le fichier n'existe pas. Cela provoque l'instruction if pour exécuter la clause else.

Essayons encore une fois ...

$ 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

Ici, la commande ls a renvoyé un 0 exit status (car le fichier existe et le fichier existe et peut être staté par la commande ls.

Normalement, vous ne devez pas utiliser la commande ls pour tester un fichier. Je l'ai simplement utilisé ici pour montrer que l'instruction if exécute la commande, puis j'ai exécuté la clause if ou else selon l'état de sortie de cette commande. Si vous souhaitez tester si un fichier existe ou non, vous devez utiliser le test -e commande au lieu de ls commande:

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

Si le fichier existe, test -e renverra un état de sortie de 0. Sinon, il renverra un état de sortie non nul.

Si tu fais ça:

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

Cette 10958 est l'inode . Les fichiers avec le même inode sont deux noms différents pour le même fichier. Donc [ et test les commandes sont liées1. Cela signifie que vous pouvez utiliser [ au lieu de test:

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

Ça vous semble familier?


1. En BASH, les test et [ sont intégrés, donc lorsque vous exécutez ces commandes dans BASH, il ne s'exécute pas /bin/test ou /bin/[. Cependant, ils sont toujours liés les uns aux autres.

3
David W.

Ce n'est en fait pas if qui les fournit - c'est [, mieux connu sous le nom de test. help test devrait vous donner une liste de toutes les options possibles. Vous pouvez également consulter la norme , si vous vous en souciez.

3
icktoofay