2009-08-04 5 views
6

J'ajoute une fonctionnalité à un script existant qui permettra à l'utilisateur de configurer le nom d'hôte d'un système Linux. Les règles que je suis sont les suivantes faire respecter:Comment puis-je m'assurer qu'une chaîne Bash est alphanumérique, sans trait de soulignement?

  • doit être comprise entre 2 et 63 caractères
  • ne doit pas commencer ou se terminer par un trait d'union
  • peut contenir que des caractères alphanumériques et traits d'union; Tous les autres caractères ne sont pas autorisés (y compris un trait de soulignement, ce qui signifie que je ne peux pas utiliser le symbole \ W regex)

J'ai résolu les deux premiers caractères de la liste, mais je n'arrive pas à comprendre comment pour vérifier si une chaîne bash contient uniquement des lettres, des chiffres et des tirets. Je pense que je peux le faire avec une regex, mais j'ai du mal à comprendre comment (j'ai passé l'heure passée à chercher sur le web et à lire des pages de manuel).

Je suis ouvert à l'utilisation de sed, grep ou de n'importe quel autre outil standard, mais pas Perl ou Python.

Répondre

14

On dirait que cela devrait le faire:

^[a-zA-Z0-9][-a-zA-Z0-9]{0,61}[a-zA-Z0-9]$ 

un match de tout caractère alphanumérique, puis correspondent à 61 caractères alphanumériques (y compris les traits d'union), puis correspondent à un caractère alphanumérique. La longueur minimale de la chaîne est 2, le maximum est 63. Cela ne fonctionne pas avec Unicode. Si vous en avez besoin pour travailler avec Unicode, vous devrez ajouter différentes classes de caractères à la place de a-zA-Z0-9 mais le principe sera le même.

Je crois que l'expression grep correcte qui fonctionnera avec Unicode est:

^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$ 
+1

Comment utilisez-vous la deuxième expression avec grep? Je cherche des commutateurs dans la page de manuel mais sans succès: je fais écho à une chaîne qui devrait correspondre et rien n'est produit. –

+0

@Montecristo: 'grep -E' ou' egrep' – Welbog

+0

Je l'ai essayé avec ceci: echo 1asdas * _- | grep -E '^ [[alnum:]] [- [: alnum:]] {0,61} [[: alnum:]] $', sans sortie (aussi sans guillemets simples), lol je devrais demander à un question je pense ...: P –

1

Ceci est la dernière dont vous avez besoin: sed -e 's/[^[:alnum:]|-]//g'

2

Ceci est un script bash tester le premier paramètre si elle contient seulement alphanumériques ou traits d'union. Il "tuyaux" le contenu de 1 $ dans grep:

#!/bin/bash 
if grep '^[-0-9a-zA-Z]*$' <<<$1 ; 
    then echo ok; 
    else echo ko; 
fi 
+0

Pourquoi '^' représente ici la négativité au lieu de la première occurrence? – Stallman

+0

Cela signifie "début de ligne", de sorte que chaque caractère entre elle et "$" doit correspondre au motif. –

0

vous pouvez le faire avec juste bash

string="-sdfsf" 
length=${#string} 
if [ $length -lt 2 -o $length -gt 63 ] ;then 
    echo "length invalid" 
    exit 
fi 
case $string in 
    -*) echo "not ok : start with hyphen";exit ;;  
    *-) echo "not ok : end with hyphen";exit ;; 
    *[^a-zA-Z0-9-]*) echo "not ok : special character";exit;; 
esac 
Questions connexes