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