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 :

Syntax error: "(" unexpected (expecting "}")


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 11
    Par défaut Syntax error: "(" unexpected (expecting "}")
    Bonjour à tous,

    Je bloc sur une ligne dans un fichier bash,

    En clair j'ai un petit script qui marche très bien et que je veux améliorer un peu , et il me fait l'erreur ci dessus des que je rajoute cette simple ligne:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    num=$[($RANDOM % ($[6-1]+1))+100]
    ligne de code que j 'ai trouvé ici

    En fait je veux qu'il me génère un chiffre au hasard entre 1 et 6 (pour le moment) et que j'utiliserai un peu plus loin dans le script.

    Pouvez vous m'expliquer ?

    voici le debut du script si ca peu aider
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    #!/bin/sh
     
    USER=$('whoami')
    #echo utilisateur :$USER
     
    IP_SE3="192.168.58.200"
     
    user="admin"
    password="*********"
    partage="docspartages"
    fichier="diaporama_accueil."
    chemin="/administratif/diaporama_accueil/"
     
     
    # on test les différentes extentions possible
     
    _test_extention="pps ppt pptx ppsx odp" ;
     
    checkextention () {
     
            for extention in ${_test_extention} ; do
                    echo -n "cherche pour \"$extention\" ... " ;
            RECHERCHE=$(smbclient //$IP_SE3/$partage -U $user%$password -c 'ls '$chemin''$fichier''$extention''| cut -f 1 | awk '{print $1}' )
     
                    if  [ "$RECHERCHE" != "NT_STATUS_NO_SUCH_FILE" ]
                    then
     
    ext=$extention
    else
     
    echo "Le fichier n'existe pas!";
     
    fi
     
                  done
     
     
    }
     
    imagealeatoire () {
     
    num=$[('$RANDOM' % ($[6-1]+1))+100]
    }
     
    imagealeatoire


    merci à tous

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

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

    les lignes ne sont pas identiques : dans le script, la variable RANDOM (qui n'est pas POSIX, et qui donc ne fonctionnera pas avec /bin/sh, si ce fichier n'est pas un lien vers bash) est entre apostrophes, ce qui a pour effet d'inhiber son développement.

    NB : cette forme d'évaluation arithmétique est datée.
    de nos jours, on utilise des parenthèses doubles :
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 11
    Par défaut
    ok merci , oui les lignes ne sont pas identique je faisait des essais à taton pour trouvé une solution.

    merci pour l'info, en fait je me suis mis en bash et non en sh et ça marche.

    bon mmaintenant j'ai une autre erreur plus bas lors du test sur la date du fichier lors de la

    definition de la variable VERSION_NEW (ligne 79)

    il me retourne lors de l echo de debug en dessous : version new: failed(ErrorNT_STATUS_UNSUCCESSFUL) (ligne 80)

    or si je tape la commande direct sous shell ca marche bien donc je suppose erreur de syntax quelque part mais je seche.

    est-ce la même erreur ???? je ne peux pas tester ce week end . je verrai ça lundi.

    doit-je l'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VERSION_NEW=$((smbclient //$IP_SE3/$partage -U $user%$password -c 'ls '$chemin''$fichier''$ext''  | cut -f 1 | awk '{print $4 $5 $6 $7 $8}'))
    Merci encore
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    #!/bin/bash
     
    USER=$('whoami')
    #echo utilisateur :$USER
     
    IP_SE3="10.37.58.200"
     
    user="admin"
    password="0371124w"
    partage="docspartages"
    fichier="diaporama_accueil."
    chemin="/administratif/diaporama_accueil/"
     
     
    # on test les différentes extentions possible
     
    _test_extention="pps ppt pptx ppsx odp" ;
     
    checkextention () {
     
            for extention in ${_test_extention} ; do
                    echo -n "cherche pour \"$extention\" ... " ;
            RECHERCHE=$(smbclient //$IP_SE3/$partage -U $user%$password -c 'ls '$chemin''$fichier''$extention''| cut -f 1 | awk '{print $1}' )
     
                    if  [ "$RECHERCHE" != "NT_STATUS_NO_SUCH_FILE" ]
                    then
     
    ext=$extention
    else
     
    echo "Le fichier n'existe pas!";
     
    fi
     
                  done
     
     
    }
     
    imagealeatoire () {
    min=1
    max=6
    number=$[($RANDOM % ($[$max - $min] + 1)) + $min]
    #echo $number
    }
     
    #imagealeatoire
     
    # Pour le débugguage : fichiers de log journalier (les raspi redémarrant chaque jour)
    # exec 1> "/home/$USER/sorties.log" 2> "/home/$USER/erreurs.log"
     
    # Pour éviter que l'écran ne s'éteigne au bout d'un certain temps      
    xset s off        
    xset -dpms
     
     
    # On affiche l'image d'arrière fond pour "masquer" le bureau LXDE de Raspbian.
    changefeh (){
    killall -9 feh
    HOME=/home/$USER/ DISPLAY=:0 feh -Z -F -Y "/home/"$USER"/Pictures/"$number".gif" &
     
    }
     
    # Initialisation des variables
    VERSION_OLD="toto"
    PID=""
     
     
    # On attend 15 secondes que wicd configure le réseau
    sleep 15
     
    # On teste toutes 20 secondes si une nouvelle version du diapo est disponible sur le partage et on met à jour si nécessaire ...
    while true; do
        # On test les differentes version de diaporama possible
        checkextention
        changefeh
        #  On rècupère la date de dernière modification du diaporama, sur le partage Samba
        VERSION_NEW=$(smbclient //$IP_SE3/$partage -U $user%$password -c 'ls '$chemin''$fichier''$ext''  | cut -f 1 | awk '{print $4 $5 $6 $7 $8}')
       echo "version new: "$VERSION_NEW
       echo "versio old : "$VERSION_OLD


    Merci pour tout

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    ON N'UTILISE PAS ls DANS UN SCRIPT !!!
    on utilise stat* !

    donc, a priori :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    smb[...] -c "stat $chemin$fichier$ext"
    * parce qu'il permet un formatage fin de la sortie (n'afficher que le nécessaire).
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 11
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    ON N'UTILISE PAS ls DANS UN SCRIPT !!!
    ON NE TAPE PAS SUR LES DOIGTS , CA FAIT MAL !!!!!

    Bon pour le moment chez moi la connexion sur le nas ne fonctionne pas : version new: Server doesn't support UNIX CIFS calls.

    pourtant cifs est activé sur le nas.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Citation Envoyé par steph-ero Voir le message
    ON NE TAPE PAS SUR LES DOIGTS , CA FAIT MAL !!!!!

    Citation Envoyé par Sheldon Cooper
    là, là.
    là, là.
    Bon pour le moment chez moi la connexion sur le nas ne fonctionne pas : version new: Server doesn't support UNIX CIFS calls.

    pourtant cifs est activé sur le nas.
    c'est un autre problème qui requiert l'ouverture d'un nouveau sujet.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    ON N'UTILISE PAS ls DANS UN SCRIPT !!! ...
    * parce qu'il permet un formatage fin de la sortie (n'afficher que le nécessaire).
    J’avoue ne pas comprendre.
    Pourrais tu m'aider à bien mesurer l'avantage ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    si tu veux récupérer des informations (la date, par exemple) concernant un fichier, il est plus simple, et plus fiable, de n'utiliser que stat, qui permet (avec son option -c) de n'afficher que les données pertinentes dans un format réutilisable , plutôt que de bricoler la sortie de ls.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    Merci,
    mais je ne suis pas arrivé encore à découvrir la clé.

    Heu ... , je ne vois pas trop une grande différence dans la récupération entre ces deux commandes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     ls -l --time-style=long-iso fichier
    stat -c  --format=%x fichier

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    il y a quand même une petite différence, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ > fichier
    $ ls -l --time-style=long-iso fichier
    -rw-r--r-- 1 nbah nbah 0 2016-11-28 05:43 fichier #là, il y a bricolage pour récupérer l'info pertinente
    $ stat -c '%x' fichier
    2016-11-28 05:43:33.533485190 +0100 #ici, c'est tout-cuit.
    $
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 11
    Par défaut
    Suis d'accord sur le resultat de commande qui me renvoie exactement les infos que je cherche.
    Merci
    Je rouvre un autre post pour mon nouveau problème.

  12. #12
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    il y a quand même une petite différence, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ > fichier
    $ ls -l --time-style=long-iso fichier
    -rw-r--r-- 1 nbah nbah 0 2016-11-28 05:43 fichier #là, il y a bricolage pour récupérer l'info pertinente
    $ stat -c '%x' fichier
    2016-11-28 05:43:33.533485190 +0100 #ici, c'est tout-cuit.
    $
    Oui.
    Mes connaissances étant très basique, en la matière, j'étais apeuré par la violence de ta remarque sur ls dans un script. Et connaissant ta grande expérience, je me demandais quel est le vice caché de l'usage de ls, pour que je n'y sois pas confronté.
    Heureusement c'est pas terrible. Sinon je devais corriger quelques scripts critiques.

    Mais la deuxième sortie a 2 champs. Le bricolage consistant à récupérer un champ, ici n'est-il pas nécessaire ?

    Ah quel idiot, j'ai compris en examinant attentivement la sortie de stat. Effectivement c'est tout cuit .

    Je viens de remarquer une autre bizarrerie chez moi avec les 2 commandes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ls -l --time-style=long-iso fichier
    -rw-r--r-- 1 nvcfrm nvcfrm 3112 2016-11-28 00:41 note
    root@ns-unise:/home/nvcfrm# stat -c '%x' fichier
    2016-11-28 01:15:28.724651849 +0000
    J'ai aussi remarqué que même en changeant les valeurs dans l'argument --time=ctime ..., j'ai le même résultat. Est ce une limitation propre à ls ou à d'autres choses.

  13. #13
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 358
    Par défaut
    Bonjour,

    @NVCfrm : ls est surtout risqué lorsqu'on l'utilise pour se créer une liste de fichier que l'on va ensuite parcourir. Dans ce cas, il faut prendre en considération des fichiers avec des espaces ou autre caractères de control.

    Exemple simpliste avec un nom de fichier possédant au moins un espace:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ ls -lQ
    total 0
    -rw-rw-r-- 1 disedorgue disedorgue 0 nov.  28 18:53 "fichier avec espace"
    -rw-rw-r-- 1 disedorgue disedorgue 0 nov.  28 18:58 "fichieravecespacefin "
    $ for i in $(ls); do ls "$i"; done
    ls: impossible d'accéder à fichier: Aucun fichier ou dossier de ce type
    ls: impossible d'accéder à avec: Aucun fichier ou dossier de ce type
    ls: impossible d'accéder à espace: Aucun fichier ou dossier de ce type
    ls: impossible d'accéder à fichieravecespacefin: Aucun fichier ou dossier de ce type
    $ for i in *; do ls "$i"; done
    fichier avec espace
    fichieravecespacefin

  14. #14
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    Interessant.
    Je n'ai pas encore été confronté à ça, mais c'est utile, à mettre dans un coin de neurones pour le cas où.

  15. #15
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonjour.

    Sinon, n'oubliez pas que ce genre de bonnes pratiques répétées dans des centaines de discussions sur ce forum ont été illustrées et expliquées dans deux ressources qu'il faut pas hésiter à consulter et re-consulter :

    La FAQ Shell : http://linux.developpez.com/faq/?page=Le-Shell
    Pourquoi faut-il éviter d'utiliser la boucle for sur une sortie de commande ?
    Pourquoi faut-il éviter la commande ls dans les scripts ?

    Quelques bonnes pratiques dans l'écriture de scripts en Bash : Pourquoi faut-il éviter la commande ls dans l'écriture des scripts

    Cordialement,
    Idriss

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur "Syntax error on token "(", new expected after this token"
    Par domxaline dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 20/02/2013, 15h40
  2. Réponses: 16
    Dernier message: 28/06/2007, 17h10

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