Regex : négation chaine

Résolu
Fred -  
 Fred -
Bonjour,

Je souhaite faire un script bash qui accepte en paramètre des options complexe mais comme il peut être exécuté en tant que root, je voudrais contrôler ces paramètres.

Le script doit pouvoir accepter toutes les options de la commande lsof. Il ne doit pas y avoir dans les paramètres les caractères ";" ">" et "|" mais j'aimerais quand même autoriser "|grep".

Un extrait du script :

forbidden='[;>]|(\|grep)'

if [[ ${params} =~ ${forbidden} ]]; then
echo "Caract interdit"
exit 3
fi

J'arrive à interdire ; > et |grep, mais je ne sais pas comment interdire le caractère | sauf s'il est suivit de "grep".

Pouvez-vous me dire comment écrire cette expression régulière ?

2 réponses

zipe31 Messages postés 38797 Statut Contributeur 6 433
 
Salut,

A mon avis il faut que tu sépares en deux ton test. Un premier pour tester
[;>]
et un second pour le pipe (
|
). Puis si le pipe est intercepté, tu vérifies s'il est suivi ou non d'un
grep
...

$ echo "blibli | grep blabla" | egrep -o '\| *grep'
| grep

$ echo "blibli |grep blabla" | egrep -o '\| *grep'
|grep

$ echo "blibli |sed blabla" | egrep -o '\| *grep'

$
1
Fred
 
J'aurais préféré faire un seul test, mais si ce n'est pas possible, je partirais sur une solution de ce type.
Par contre, il faudra que je prenne en compte le fait qu'il peut y avoir plusieurs caractères | un suivit de grep et un autre avec autre chose.

Merci pour votre réponse
0
dubcek Messages postés 19021 Statut Contributeur 5 637
 
hello
essayer avec grep, à vérifier
$ params='|grep'
$ [[ $(grep -P '[;>]|\|(?!grep)' <<<"$params") ]]&& echo stop ||echo ok
ok
$ params='|fgrep'
$ [[ $(grep -P '[;>]|\|(?!grep)' <<<"$params") ]] && echo stop || echo ok
stop
$ params='|'
$ [[ $(grep -P '[;>]|\|(?!grep)' <<<"$params") ]] && echo stop || echo ok
stop
$ params='a>'
$ [[ $(grep -P '[;>]|\|(?!grep)' <<<"$params") ]] && echo stop || echo ok
stop
$ params='|grap'
$ [[ $(grep -P '[;>]|\|(?!grep)' <<<"$params") ]] && echo stop || echo ok
stop
$
1
Fred
 
Je n'ai pas bien compris çà fonctionne mieux avec une rexexp perl en passant par grep qu'en faisant le test directement, mais cela correspond bien à mon besoin ;-)

Merci
0