Que font les options-n et-a dans une instruction bash if? [dupliquer]

Cette question a déjà une réponse ici:

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

25
demandé sur Cory Klein 2013-02-15 21:49:32

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
24
répondu Sorpigal 2015-04-05 15:49:54

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

55
répondu Cory Klein 2016-05-01 16:38:05