2 votes

Recherche d'une chaîne ou d'un motif dans un texte sélectionné en BASH

Je veux décrypter le texte sélectionné si la chaîne "-----BEGIN PGP MESSAGE-----" apparaît dans le texte sélectionné. J'ai le code suivant mais il n'affiche rien.

#!/bin/bash
xsel > pgp.txt
if [grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt]
then
gnome-terminal --command "gpg -d -o decrypted.txt pgp.txt"
gedit decrypted.txt
fi

Lorsque je l'exécute dans le terminal après avoir sélectionné un texte, le message suivant s'affiche

line 3: [grep: command not found

Je suis nouveau dans le domaine des scripts bash. Toute aide serait appréciée.
Merci de votre attention.

4voto

jammus Points 1796

Confusément, [ est en fait un programme, il est également connu sous le nom de test (1) . Il n'est pas nécessaire d'entourer la commande grep d'une balise [ . Si vous deviez utiliser [ pour quelque chose, vous devez séparer la parenthèse gauche par un caractère d'espacement [ foo == bar ]

La syntaxe if est la suivante : help if

if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi

The `if COMMANDS' list is executed.  If its exit status is zero, then the
`then COMMANDS' list is executed. 

La commande que vous souhaitez est probablement plus proche de celle-ci.

if grep -q -e "-----BEGIN PGP MESSAGE-----" pgp.txt; then
   ...
   ...
fi

2voto

Laurentiu Roescu Points 2246

Il doit y avoir un espace après [. Et grep renvoie des chaînes de caractères, de sorte que votre test pourrait échouer. Vous devriez vérifier le statut de sortie de grep.

grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt
exitcode=$?
if [ $exitcode ]
then
   # not found
else
   # found 
fi

1voto

quanta Points 49664

[ est une commande, pas une syntaxe. Elle est équivalente à la commande test commande.

Retirez les crochets pour voir si cela fonctionne :

#!/bin/bash
xsel > pgp.txt
if grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt
then
    gnome-terminal --command "gpg -d -o decrypted.txt pgp.txt"
    gedit decrypted.txt
fi

UPDATE :

L'insertion d'un espace après la parenthèse gauche ne fonctionne pas non plus dans votre cas :

if [ grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt ]
then

parce que bash l'étend comme suit :

if test grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt
then

et vous obtiendrez le line 3: [: too many arguments erreur.

Rappelez-vous que [ est un ordre. Elle prend des arguments et des procédures un code de sortie.

Vous pouvez également ignorer la sortie standard de la commande grep en utilisant :

if grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt >/dev/null
then

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X