2010-03-16 3 views
0

Je ne peux pas contourner cela assez longtemps maintenant. En lisant des manuels et des tutoriels, je deviens de plus en plus confus. Je veux une déclaration si avec la logique suivante:Mélange d'une expression régulière et d'une autre expression conditionnelle dans une instruction bash if

if [ -n $drupal_version ] && [[ "$drupal_version" =~ DRUPAL-[6-9]-[1-9][1-9] ]]; then 

mais je ne peux pas le faire fonctionner correctement. Lorsque le script est évalué à l'aide de la construction de script "bash -x ...", fonctionne bien mais quand il s'exécute comme un script normal, mon expression n'est pas évaluée (bien que la condition ci-dessus doive être remplie, la partie else est exécutée).

Pourriez-vous fournir de l'aide?

+0

Quelle version de Bash? –

Répondre

0

vous pouvez utiliser case/esac, sans regex. peut être utilisé dans bash < 3,2

if [ -n "$drupal_version" ] ;then 
    case "$drupal_version" in 
    DRUPAL-[6-9]-[1-9][1-9]) 
     echo "found" 
     ;; 
    *) 
     echo "version not correct" 
     ;; 
    esac 
fi 

cependant, si vous voulez regex, notez qu'il est =~ pas =

[[ $drupal_version =~ DRUPAL-[6-9]-[1-9][1-9] ]] && echo "found" 
+0

l'approche du cas est intéressante. L'utilisation de "=" est une faute de frappe de ma part, dans mon code j'utilise "= ~" Y at-il un problème lors du mixage des parenthèses simples [avec des doubles crochets [[dans la même instruction if? – Tassos

+0

non, il n'y a pas de problème, mais il y a quelques différences entre l'utilisation de ']' et ']]'. Si vous utilisez un simple ']', citez vos variables.vous pouvez voir http://serverfault.com/questions/52034/what-is-the-difference -between-double-et-single-brackets-in-bash – ghostdog74

0

Merci à tous pour vos réponses. Les doubles parenthèses]] sont une construction spécifique à bash qui à son tour requiert la première ligne de votre script pointant vers #!/Bin/bash au lieu de #!/Bin/sh que la mienne a fait. Changé cette ligne et tout fonctionne.