IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

grep : binary operator expected


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 155
    Par défaut grep : binary operator expected
    Bonjour,

    Je réalise mon premier script shell et ce n'est pas facile.

    Voici le script que je suis en train de faire :

    1) Je met dans un tableau le chemin de tous les dossiers dont j'ai besoin.
    2) Je récupère sur un autre serveur la liste des dossiers.
    3) Je vérifie que chaque dossiers dont j'ai besoin existe sur l'autre serveur.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    #!/bin/sh
     
    DATE=`date +%d_%m_%Y`
    JOUR=`date +%d`
     
    # je met le chemin de tous les dossiers dont j'ai besoin dans un tableau
    tableau=(
    "sauvegarde/$DATE/" 
    "sauvegarde/$DATE/bdd/" 
    "sauvegarde/$DATE/sites/" 
    "sauvegarde/$DATE/configuration/"
    )
     
    # Je liste tous les dossiers présent sur le serveur de sauvegarde et je les liste dans listing.txt
    ssh root@leserveur.net find /sauvegarde/ -type d > /sauvegarde/listing.txt 
     
    # Je verifie que chaque dossier dont j'ai besoin est bien créé sur le serveur de sauvegarde
    for fichier in ${tableau[@]}
    do
    	if [ grep "$fichier" /sauvegarde/listing.txt ]
    	then
    		echo ""
    		echo "Le dossier existe."
    		echo ""
    	else
    		echo ""
    		echo "Le dossier n'héxiste pas."
    		echo ""
    	fi
     
    done
    L'étape 2 fonctionne et le fichier listing.txt contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /sauvegarde/
    /sauvegarde/configuration
    /sauvegarde/configuration/xx.xxxxxxxx.com
    /sauvegarde/configuration/xx.xxxxxxxx.com/etc
    /sauvegarde/sites
    /sauvegarde/sites/xx.xxxxxxxx
    /sauvegarde/sites/xx.xxxxxxxx/img
    /sauvegarde/sites/xx.xxxxxxxx/include
    /sauvegarde/sites/xx.xxxxxxxx/maj
    .....etc
    par contre quand je veux vérifier que chaque ligne du tableau existe dans listing.txt, j'ai le message d'erreur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./test.sh: line 20: [: sauvegarde/08_08_2013/: binary operator expected
    et ce pour chaque ligne du tableau.

    Quelqu'un voie t-il ce qui ne va pas.

    Merci d’avance.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 646
    Par défaut
    Bonjour,

    • sh n'a pas de tableau : revois comment exécuter un script !
    • un tableau dans une boucle for doit être mis entre guillemets, sinon, la boucle itérera sur chaque mot du tableau, et non sur chaque élément.
    • pour exécuter une commande dans un test, il faut utiliser le remplacement de commandes. Mais dans ton cas le test est inutile :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      if grep [...]
      then
         [...]
      else
         [...]
      fi
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    Quand j'ai deux fichiers liste1 et liste2, pour savoir si l'un est contenu dans l'autre, je fais plutôt un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     grep -F -v -f liste2 liste1
    Ainsi, il me renvoie un fichier vide. Sinon, il me renvoie les lignes qui sont dans liste1 mais pas dans liste2.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 829
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par yann123456 Voir le message
    ...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ grep "$fichier" /sauvegarde/listing.txt ]

    par contre quand je veux vérifier que chaque ligne du tableau existe dans listing.txt, j'ai le message d'erreur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./test.sh: line 20: [: sauvegarde/08_08_2013/: binary operator expected
    et ce pour chaque ligne du tableau.

    Quelqu'un voie t-il ce qui ne va pas.

    Merci d’avance.
    Salut

    Les crochets sont un raccourci de la commande "test". Donc c'est comme si t'avais écrit
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    if test grep "$fichier" /sauvegarde/listing.txt
    Or cette commande "test grep" ne veut rien dire ("grep" n'est pas un argument prévu pour "test")

    Soit tu utilises la commande "test" pour ce qu'elle sait faire (ex: vérifier la valeur de variables, les caractéristiques des fichiers) et tu utilises les options prévues pour ça (test -s fichier, test "$var" = "valeur") ; soit tu utilises la commande "grep" et tu peux éventuellement programmer une alternative dessus en tapant simplement if grep ....

    Le message d'erreur signifie que la commande "test" attend un opérateur binaire (comme "=", "!=", "-eq", etc).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [GCC 4.4 svn] missing binary operator before token "("
    Par Florian Goo dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/10/2008, 16h35
  2. Bareword found where operator expected at stats.pl
    Par Premium dans le forum Langage
    Réponses: 2
    Dernier message: 21/01/2008, 13h04
  3. Réponses: 2
    Dernier message: 12/10/2007, 23h29
  4. Réponses: 7
    Dernier message: 04/12/2006, 21h15
  5. Scalar found where operator expected at...
    Par Mr Hyde dans le forum Langage
    Réponses: 4
    Dernier message: 21/09/2005, 16h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo