Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/03/2020, à 22:29

lebossejames

bash script commande ne fonctionnant pas

Bonjour,

J'ai essayé cette commande dans un terminal et cela fonctionne:

cd v1.00 && cp -rf !(Backup_release|Logs|script.sh|Tools) ../../PROD/projet/v1.00/tmp/

mon script qui est appelé par cette commande:

./Script.sh -c v1.00 projet
#!/bin/bash

while [ "$1" != "" ]; do
    PARAM=`echo $1 | awk -F= '{print $1}'`
    VALUE=`echo $1 | awk -F= '{print $2}'`
    case $PARAM in
        -h | --help)
            echo "add option -c to create new release"        
            echo "first parameter is version"
            echo "second parameter is name of project"
            version="$2"
            exit
            ;;
        -c)
         version=$2
         nameProject=$3

         cd $version && cp -rf !(Backup_release|Logs|script.sh|Tools) ../../PROD/${nameProject}/${version}/tmp/

         ;;
    
        
    esac
    shift
done

J'obtiens cette erreur:

./Script.sh: ligne 35: erreur de syntaxe près du symbole inattendu « (


Merci d'avance.

Dernière modification par lebossejames (Le 25/03/2020, à 10:37)

Hors ligne

#2 Le 24/03/2020, à 22:34

Watael

Re : bash script commande ne fonctionnant pas

salut,

quel est le shebang ?
probablement /bin/sh, il faut utiliser bash.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 24/03/2020, à 22:44

lebossejames

Re : bash script commande ne fonctionnant pas

C'est du bash.

Hors ligne

#4 Le 24/03/2020, à 22:55

Watael

Re : bash script commande ne fonctionnant pas

je sais que c'est du bash; ça n'implique pas que le shebang soit correctement "formé", ni que ce soit exécuté dans un contexte bash, comme l'indique le message d'erreur que j'obtiens à l'identique sous /bin/dash.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 24/03/2020, à 23:13

kamaris

Re : bash script commande ne fonctionnant pas

Il faut que tu actives le développement étendu de chemins :

shopt -s extglob

Hors ligne

#6 Le 24/03/2020, à 23:51

Watael

Re : bash script commande ne fonctionnant pas

ça ne donne pas le même message d'erreur.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#7 Le 25/03/2020, à 00:45

kamaris

Re : bash script commande ne fonctionnant pas

Bah si, j'obtiens bien la même chose :

$ touch baz
$ bash -c 'ls !(foo|bar)'
bash: -c: ligne 0: erreur de syntaxe près du symbole inattendu « ( »
bash: -c: ligne 0: `ls !(foo|bar)'
$ bash -O extglob -c 'ls !(foo|bar)'
baz
$ 

À moins que tu veuilles dire que, dans ce cas, il y a deux lignes, contrairement à

$ dash -c 'ls !(foo|bar)'
dash: 1: Syntax error: "(" unexpected
$ 

Mais est-on sûr que lebossejames n'a qu'une ligne dans son retour ?

Hors ligne

#8 Le 25/03/2020, à 02:40

Watael

Re : bash script commande ne fonctionnant pas

une particularité de l'option -c ?

$ bash
$ ls !(foo|bar)
bash: !: event not found
$ shopt -s extglob
$ ls !(foo|bar)
...liste de mes fichiers...
$ exit
$ dash
$ ls !(foo|bar)
dash: 1: Syntax error: "(" unexpected

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 25/03/2020, à 03:20

kamaris

Re : bash script commande ne fonctionnant pas

Ben c'est juste qu'avec l'option -c c'est un shell non-interactif, comme dans un script (ce qui est le cas de lebossejames), donc extglob et l'historique sont désactivés.
Mais en interactif, on peut faire

$ shopt -u extglob
$ set +o history
$ ls !(foo|bar)
bash: erreur de syntaxe près du symbole inattendu « ( »
$ 

Hors ligne

#10 Le 25/03/2020, à 10:38

lebossejames

Re : bash script commande ne fonctionnant pas

Excusez-moi j''avais oublié de mettre la boucle dans le code. Voir premier message.

Hors ligne

#11 Le 25/03/2020, à 11:14

pingouinux

Re : bash script commande ne fonctionnant pas

Bonjour,

kamaris #9 a écrit :

Ben c'est juste qu'avec l'option -c c'est un shell non-interactif

Ici -c est juste le premier paramètre fourni au script ./Script.sh.

lebossejames #10 a écrit :

Excusez-moi j''avais oublié de mettre la boucle dans le code. Voir premier message.

Le message d'erreur ne semble pas correspondre à ce script, qui contient 25 lignes.

./Script.sh: ligne 35: erreur de syntaxe près du symbole inattendu « (

Hors ligne

#12 Le 25/03/2020, à 11:21

lebossejames

Re : bash script commande ne fonctionnant pas

C'est bien cette ligne qui pose problème car en le mettant en commentaire. Le script fonctionne.

C''est juste que je n'ai pas mis les autres lignes qui n'impacte sur le problème rencontré.

Hors ligne

#13 Le 25/03/2020, à 11:29

pingouinux

Re : bash script commande ne fonctionnant pas

Il faut jouer aux devinettes, alors.
As-tu essayé la solution de kamaris en #5 ?
Je ne comprends pas à quoi sert la boucle.

Hors ligne

#14 Le 25/03/2020, à 11:34

lebossejames

Re : bash script commande ne fonctionnant pas

kamaris a écrit :

Il faut que tu actives le développement étendu de chemins :

shopt -s extglob

Merci avec cela, ça marche.

Hors ligne

#15 Le 25/03/2020, à 11:35

lebossejames

Re : bash script commande ne fonctionnant pas

pingouinux a écrit :

Il faut jouer aux devinettes, alors.
As-tu essayé la solution de kamaris en #5 ?
Je ne comprends pas à quoi sert la boucle.


Je souhaitais gérer les options afin que le script devra prendre en considération des arguments.

Hors ligne

#16 Le 25/03/2020, à 13:45

Watael

Re : bash script commande ne fonctionnant pas

extglob et l'historique sont désactivés

Oui. c'est l'historique actif dont le message d'erreur "masque" celui concernant les parenthèses, puisque extglob n'est pas actif par défaut.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#17 Le 25/03/2020, à 14:30

kamaris

Re : bash script commande ne fonctionnant pas

pingouinux a écrit :

Bonjour,

kamaris #9 a écrit :

Ben c'est juste qu'avec l'option -c c'est un shell non-interactif

Ici -c est juste le premier paramètre fourni au script ./Script.sh.

Non, je parlais du -c que j'utilise avec bash en #7 big_smile
Je n'avais même pas vu que lebossejames avait un -c comme option à son script en #1, et je pense que Watael en #8 parlais aussi de « mon » -c, pas de celui de lebossejames.

Hors ligne

#18 Le 25/03/2020, à 16:01

pingouinux

Re : bash script commande ne fonctionnant pas

Grosse méprise, désolé…

Hors ligne

#19 Le 25/03/2020, à 18:11

Watael

Re : bash script commande ne fonctionnant pas

lebossjames a écrit :

Je souhaitais gérer les options afin que le script devra prendre en considération des arguments.

pour gèrer les options d'un script bash, il existe une commande interne getopts.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#20 Le 25/03/2020, à 18:39

Sciensous

Re : bash script commande ne fonctionnant pas

@Watel: tu peux mettre un lien de doc sur getopts ?

il y a bien getopts qui est bien fait mais par exemple, que se passe-t-il si je mets une option+argument avec un = au lieu d'un espace ?
-s=option au lieu de -s option

ou que je mets une liste d'argument -s 1-9 ? est-ce que getopts prend de 1 à 9 ou la chaine 1-9

Dernière modification par Sciensous (Le 25/03/2020, à 18:47)


antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )

Hors ligne

#21 Le 25/03/2020, à 18:53

Watael

Re : bash script commande ne fonctionnant pas

que se passe-t-il si je mets une option+argument avec un = au lieu d'un espace ?

la même chose que si tu essayes de lire plusieurs arguments passés à un script, séparés par un signe égal, au lieu d'un espace !

getopts est une aide pour parcourir des options, ce n'est pas non plus magique. smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#22 Le 25/03/2020, à 20:44

kamaris

Re : bash script commande ne fonctionnant pas

Perso j'utilise getopt (sans s à la fin), qui n'est pas une primitive du shell, mais qui est plus puissant et correspond mieux à ce j'attends d'un parser d'options.
Ça fait déjà un bon tri avec une bonne gestion d'erreurs, et ça permet d'avoir tout de suite un script utilisable à la manière unix / gnu, avec typiquement ce genre de comportement :

man getopt a écrit :

A  simple short option is a '-' followed by a short option character.  If the option has a required argument, it may be written directly after the option character or as the next parameter (i.e., separated by whitespace on the command line).
[…]
It is possible to specify several short options after one '-', as long as all (except possibly the last) do not have required or optional arguments.
[…]
A long option normally begins with '--' followed by the long option name.  If the option has a required argument, it may be written directly after the long option name, separated by '=', or as the next argument (i.e., separated by whitespace on the command line).

Hors ligne