Editar: Il s'agit d'une version plus complète qui montre davantage les différences entre [
(alias test
) et [[
.
Le tableau suivant montre que le fait qu'une variable soit citée ou non, que vous utilisiez des parenthèses simples ou doubles et que la variable ne contienne qu'un espace sont les éléments qui influent sur l'utilisation d'un test avec ou sans -n/-z
convient pour vérifier une variable.
| 1a 2a 3a 4a 5a 6a | 1b 2b 3b 4b 5b 6b
| [ [" [-n [-n" [-z [-z" | [[ [[" [[-n [[-n" [[-z [[-z"
-----+------------------------------------+------------------------------------
unset| false false true false true true | false false false false true true
null | false false true false true true | false false false false true true
space| false true true true true false| true true true true false false
zero | true true true true false false| true true true true false false
digit| true true true true false false| true true true true false false
char | true true true true false false| true true true true false false
hyphn| true true true true false false| true true true true false false
two | -err- true -err- true -err- false| true true true true false false
part | -err- true -err- true -err- false| true true true true false false
Tstr | true true -err- true -err- false| true true true true false false
Fsym | false true -err- true -err- false| true true true true false false
T= | true true -err- true -err- false| true true true true false false
F= | false true -err- true -err- false| true true true true false false
T!= | true true -err- true -err- false| true true true true false false
F!= | false true -err- true -err- false| true true true true false false
Teq | true true -err- true -err- false| true true true true false false
Feq | false true -err- true -err- false| true true true true false false
Tne | true true -err- true -err- false| true true true true false false
Fne | false true -err- true -err- false| true true true true false false
Si vous voulez savoir si une variable a une longueur non nulle, effectuez l'une des opérations suivantes :
- citer la variable entre parenthèses simples (colonne 2a)
- utiliser
-n
et citer la variable entre parenthèses simples (colonne 4a)
- utiliser des doubles crochets avec ou sans citation et avec ou sans
-n
(colonnes 1b - 4b)
Remarquez dans la colonne 1a à partir de la ligne intitulée "deux" que le résultat indique que [
évalue le contenu de la variable comme s'ils faisaient partie de l'expression conditionnelle (le résultat correspond à l'assertion impliquée par le "T" ou le "F" dans la colonne de description). Lorsque [[
est utilisé (colonne 1b), le contenu de la variable est considéré comme une chaîne de caractères et n'est pas évalué.
Les erreurs des colonnes 3a et 5a sont dues au fait que la valeur de la variable comprend un espace et que la variable n'est pas citée. De nouveau, comme le montrent les colonnes 3b et 5b, [[
évalue le contenu de la variable comme une chaîne de caractères.
De même, pour les tests de chaînes de longueur nulle, les colonnes 6a, 5b et 6b montrent les manières correctes de procéder. Notez également que n'importe lequel de ces tests peut être annulé si la négation présente une intention plus claire que l'utilisation de l'opération inverse. Par exemple : if ! [[ -n $var ]]
.
Si vous utilisez [
Pour être sûr de ne pas obtenir de résultats inattendus, il faut citer la variable. Utilisation de [[
ça n'a pas d'importance.
Les messages d'erreur, qui sont supprimés, sont "opérateur unaire attendu" ou "opérateur binaire attendu".
C'est le script qui a produit le tableau ci-dessus.
#!/bin/bash
# by Dennis Williamson
# 2010-10-06, revised 2010-11-10
# for http://stackoverflow.com/q/3869072
# designed to fit an 80 character terminal
dw=5 # description column width
w=6 # table column width
t () { printf '%-*s' "$w" " true"; }
f () { [[ $? == 1 ]] && printf '%-*s' "$w" " false" || printf '%-*s' "$w" " -err-"; }
o=/dev/null
echo ' | 1a 2a 3a 4a 5a 6a | 1b 2b 3b 4b 5b 6b'
echo ' | [ [" [-n [-n" [-z [-z" | [[ [[" [[-n [[-n" [[-z [[-z"'
echo '-----+------------------------------------+------------------------------------'
while read -r d t
do
printf '%-*s|' "$dw" "$d"
case $d in
unset) unset t ;;
space) t=' ' ;;
esac
[ $t ] 2>$o && t || f
[ "$t" ] && t || f
[ -n $t ] 2>$o && t || f
[ -n "$t" ] && t || f
[ -z $t ] 2>$o && t || f
[ -z "$t" ] && t || f
echo -n "|"
[[ $t ]] && t || f
[[ "$t" ]] && t || f
[[ -n $t ]] && t || f
[[ -n "$t" ]] && t || f
[[ -z $t ]] && t || f
[[ -z "$t" ]] && t || f
echo
done <<'EOF'
unset
null
space
zero 0
digit 1
char c
hyphn -z
two a b
part a -a
Tstr -n a
Fsym -h .
T= 1 = 1
F= 1 = 2
T!= 1 != 2
F!= 1 != 1
Teq 1 -eq 1
Feq 1 -eq 2
Tne 1 -ne 2
Fne 1 -ne 1
EOF