Test POSIX et -a

9

J'ai vérifié un de mes scripts avec checkbashisms et j'ai reçu les avertissements suivants:

possible bashism in check_ssl_cert line 821 (test -a/-o):
if [ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ] ; then

Dans la section 4.62.4 des spécifications POSIX, je trouve

primary -a primary Exécute un binaire et des résultats de primaire et primaire. L'opérateur -a a priorité sur l'opérateur -o.

Pourquoi -aet -oconsidérés comme non portables?

Matteo
la source

Réponses:

11

Ce n'est pas tant qu'il n'est pas portable, mais qu'il n'y a pas d' [implémentation où il est fiable lorsqu'il passe plus de 4 arguments.

Même en bash:

$ ALTNAMES='='  bash -c '[ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ]'
bash: line 0: [: too many arguments

La section connexe indique:

> 4 arguments :

Les résultats ne sont pas précisés.

[OB XSI] [Option Start] Sur les systèmes conformes à XSI, les combinaisons de primaires et d'opérateurs doivent être évaluées en utilisant les règles de priorité et d'associativité décrites précédemment. De plus, les primaires binaires de comparaison de chaînes '=' et "! =" Doivent avoir une priorité plus élevée que tout primaire unaire. [Fin de l'option]

-aet -odevrait être interdit. La bonne façon est d'utiliser les opérateurs shell&& et à la place:||

if [ -n "$foo" ] && [ -n "$bar" ]; then

Je le trouve même plus lisible.

Stéphane Chazelas
la source
Merci, donc la seule solution serait d'avoir deux tests? `if [-n" $ {ALTNAMES} "] && [-n" $ {COMMON_NAME}];
Matteo
3
Pas le seul mais certainement le meilleur et recommandé en remplacement de -aet-o
Stéphane Chazelas
Ok merci beaucoup (avec seulement je voulais dire qu'il n'y a aucun moyen d'avoir un seul test ...).
Matteo
1
Oui, vous pourriez le faire [ "x$ALTNAMES" != x -a "x$COMMON_NAME" != x ](toujours non spécifié selon POSIX mais portable et fiable), ou[ "${ALTNAMES:+x}${COMMON_NAME:+x}" = xx ]
Stéphane Chazelas