#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,
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.
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
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
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
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
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
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.
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 :
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