Que font les options-n et-a dans une instruction bash if? [dupliquer]
Cette question a déjà une réponse ici:
- liste des commutateurs " if " n'importe où? 5 réponses
Quelle fonction les options -a
et -n
exécutent-elles dans l'instruction bash if
suivante?
if [ -n "$1" -a -n "$2" -a -n "$3" ]; then
REFNAME=$(basename $3)
else
Sont -a
et -n
dite primaires?
-a file
signifie " True si le fichier existe."?
2 réponses
Tatillonne
Les commutateurs -a
et -n
ne sont pas strictement partie d'un bash
if
déclaration de la if
commande ne traite pas de ces commutateurs.
Que sont les primaires?
Je les appelle "switches", mais la documentation bash
à laquelle vous avez lié fait référence à la même chose que "primaries" (probablement parce que c'est un terme commun utilisé lors de la discussion de parties d'une expression booléenne).
Contexte et documents
Dans sh
scripts if
est un commande qui prend une commande comme argument, l'exécute et teste son code de retour. Si le code de retour est 0
le bloc de code suivant then
est exécuté jusqu'à la fermeture fi
, ou (si fourni) la suite else
. Si le code de retour n'était pas 0
et qu'une instruction else
a été fournie, le bloc de code suivant else
est exécuté jusqu'à la fermeture fi
.
Vous pouvez voir cet effet par le passage d' if
la commande true
, ou la commande false
, qui sont simples commandes qui ne font rien et renvoient respectivement 0
et non-0
.
if true ; then echo true was true ; else echo true was false ; fi
if false ; then echo false was true ; else echo false was false ; fi
Dans l'exemple de code que vous avez fourni, la commande que vous passez à if
est [
, qui est aussi parfois appelée test
. C'est cette commande qui prend les commutateurs que vous demandez. Dans bash
la commande test
sera une commande intégrée; essayez type [
d'apprendre son type. Pour les commandes intégrées help
montrera l'utilisation, donc également exécuter help [
voir la documentation. Votre système a probablement aussi un /bin/[
et un /bin/test
et {si vous[33]}, vous pouvez voir les manuels de ceux-ci. Bien que le comportement du test
intégré ne soit peut-être pas identique au comportement documenté dans les pages de manuel, ce qui est probablement plus verbeux que la simple description que vous obtiendrez de help [
, il décrira probablement le comportement de la commande [
intégrée avec assez de précision.
Le comportement de-a et-n
Sachant que la commande que vous utilisez est test
, nous pouvons consulter la help test
ou man test
et lire son utilisation. Cela montrera que -n
teste l'argument suivant et évalue à true s'il ne s'agit pas d'une chaîne vide.
Dans la documentation de test
, vous verrez également le commutateur -e
. Ce commutateur teste l'argument suivant et évalue à true si cet argument est un fichier ou un répertoire qui existe. Plus utile encore est le commutateur -f
qui évalue à true si l'argument suivant existe et est un fichier régulier (par opposition à un répertoire ou un périphérique de bloc, ou quoi).
La source de votre confusion est probablement qu'il peut être deux formes de -a
: Unaires et binaires. Lorsque -a
est utilisé dans un contexte unaire, c'est-à-dire avec un argument suivant mais aucun argument précédent, Il traite son argument comme un fichier et teste son existence, tout comme le commutateur -e
. Toutefois, lorsque -a
est utilisé dans un contexte binaire, c'est-à un argument avant et un argument après il, il traite ses arguments comme d'autres conditions et agit comme un booléen et opérateur.
Dans l'intérêt de la portabilité, il est important de noter que unary -a
est une extension non standard qui ne sera pas trouvée dans POSIX. Il est disponible dans bash
et ksh
, cependant, si l'utilisation est probablement répandue.
Exemple
cd /tmp
if [ -a test-file ] ; then
echo 1: test-file exists
else
echo 1: test-file missing
fi
touch test-file
if [ -a test-file ] ; then
echo 2: test-file exists
else
echo 2: test-file missing
fi
var=somerthing
if [ -n "$var" -a -a test-file ] ; then
echo variable var is not empty and test-file exists
fi
rm -f test-file
-a
relie deux expressions ensemble dans une expression" et "ou"&&". Cette option est obsolète.
-n
Vérifie si la longueur d'une chaîne est différente de zéro.
Vous pouvez traduire l'expression de test dans le pseudocode suivant:
if ( ($1 has nonzero length) and
($2 has nonzero length) and
($3 has nonzero length) )
Il n'y a aucune vérification dans cette expression pour savoir si le fichier existe ou n'existe pas, seulement si les arguments ont été fournis au script.
Les arguments -a
et -n
se trouvent dans la page de manuel pour test
man test
L'opérateur [ ... ]
est souvent utilisé comme raccourci pour test ...
et a probablement des fonctionnalités identiques sur votre système.