[
* est une commande classique, similaire à grep
, find
ou cat
. Vous devriez être en mesure de le trouver dans /bin
. Comme c'est un programme séparé, le shell effectuera son ensemble normal d'expansions avant de transmettre ses arguments à [
.
Comme cela a été mentionné, puisque vous utilisez *
dans vos tests, vous obtenez des expansions de globe. Notez que même si vous utilisez des guillemets, tels que 'hel*'
, cela ne fonctionnera probablement pas comme vous l'espérez, car [
ne prend pas en charge les motifs. Dans le cas où h*o
fonctionne, c'est probablement dû à la présence d'un fichier nommé hello
dans votre répertoire actuel, et aucun autre fichier correspondant à ce motif. Si cela fonctionne sans fichier hello
, vous pouvez avoir une implémentation étrange, et votre script est susceptible de ne pas fonctionner sur d'autres systèmes.
En fonction de vos besoins, il existe quelques options. Bash, Zsh et quelques autres shells ont le [[
intégré. Comme c'est une commande intégrée, elle peut donner un traitement spécial à ses arguments, y compris éviter l'expansion de glob. De plus, elle peut faire de la correspondance de motifs. Essayez
var1=hello
if [[ "$var1" = hel* ]]; then
echo success
fi
Remarquez également l'absence de guillemets autour du motif. Sans guillemets, hel*
est traité comme un motif par [[
, avec des guillemets (simples ou doubles), "hel*"
est traité littéralement.
Si vous avez besoin d'une compatibilité plus large, comme pour les shells sans [[
, vous pouvez utiliser grep :
var1=hello
if echo "$var1" | grep -qe 'hel.*' ; then
echo success
fi
Aucun [
ou [[
nécessaire ici, mais les guillemets autour de 'hel.*'
le sont.
*Certains shells ont effectivement <code>[</code> intégré, mais c'est pour des raisons d'efficacité. Il <em>devrait</em> toujours se comporter de manière identique à l'exécutable séparé, y compris en soumettant ses arguments à la "mutilation" normale du shell.