Comment tester qu'une variable commence par une chaîne en bash?

Pour une longueur de préfixe, je peux le faire comme ceci:

[ a${filename:0:2} = a.# ] && echo temporary emacs file

Comment faire pour un préfixe arbitraire?

y a-t-il un moyen plus propre?

23
demandé sur thomas 2010-11-09 13:12:01

2 réponses

[[= l'opérateur prend un modèle dans l'opérande de droite.

var=123
[[ 1234 = $var* ]] && ...
37
répondu Ignacio Vazquez-Abrams 2010-11-09 10:17:36

Voici la version 'regex' (2015, bash 3.x et plus récent) de la réponse D'Ignacio, en utilisant l'opérateur =~:

[[ "1234" =~ ^12 ]] && echo y

si vous avez besoin d'un préfixe dynamique à partir d'une variable:

var=12
[[ "1234" =~ ^$var ]] && echo y

lorsque vous utilisez des expressions régulières complexes, vous pouvez les placer dans une variable propre:

var=12
var2=a
regex="^${var}.+${var2}.+$"
[[ "1234a567" =~ $regex ]] && echo y

Voir aussi 'Conditionnel Construit' section de la page de manuel de Bash commande [[:

un opérateur binaire supplémentaire,=~, est disponible, avec la même priorité que == et !=. Lorsqu'elle est utilisée, la chaîne à la droite de l'opérateur est considérée comme une expression régulière étendue et correspond en conséquence (comme dans regex(3)). La valeur de retour est 0 si la chaîne de caractères correspond au motif, et 1 autrement. Si l'expression régulière est incorrecte sur le plan syntaxique, la valeur de retour de l'expression conditionnelle est 2. Si l'option shell nocasematch est activée, la correspondance est effectuée sans tenir compte du cas des caractères alphabétiques. Les sous-expressions correspondant à des sous-expressions entre parenthèses dans l'expression régulière sont sauvegardées dans le tableau de la variable BASH_REMATCH. L'élément de BASH_REMATCH avec index 0 est la partie de la chaîne correspondant à l'expression régulière entière. L'élément de BASH_REMATCH avec l'index n est la partie de la chaîne correspondant à la nème sous-expression entre parenthèses.

20
répondu t0r0X 2017-11-30 18:13:31