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 04/10/2016, à 20:08

turblad

[Résolu]Différence entre commande directe et commande en script

Bonsoir,
Je suis entrain d'étudier un peu le langage de script shell. Petit à petit, à l'aide des diverses pages internet, j'avance quelque peu. Cependant, je me heurte à un problème que je ne comprends pas :
Dans le terminal, je veux extraire une sous-chaîne depuis une variable, je tape ces commandes :

jd@ordi-jd:~$ a=qsdfgh
jd@ordi-jd:~$ b=${a:2:3}
jd@ordi-jd:~$ echo $b
dfg
jd@ordi-jd:~$ 

j'obtiens le résultat escompté, soit la sous-chaîne « dfg »
Si je mets les mêmes commandes dans un fichier de script

#!/bin/sh

a=qsdfgh
b=${a:2:3}
echo $b

J'obtiens cette erreur :

 ./essai.sh: 4: ./essai.sh: Bad substitution

------------------
(program exited with code: 2)
 

Merci d'avance de bien vouloir éclairer ma lanterne (pas trop compliqué quand même pour mon cerveau de 68 ans, j'ai débuté pâtissier et j'ai fini photographe, pas informaticien !)

Dernière modification par turblad (Le 08/01/2020, à 19:08)


Il nous fallut bien du talent pour être vieux sans être adulte
Jacques Brel (chanson des vieux amants)

Hors ligne

#2 Le 04/10/2016, à 20:16

Watael

Re : [Résolu]Différence entre commande directe et commande en script

salut,

/bin/sh n'est pas (pas toujours) bash !


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

En ligne

#3 Le 05/10/2016, à 17:30

DonutMan75

Re : [Résolu]Différence entre commande directe et commande en script

Bonsoir,
pour étoffer un peu la réponse précédente, tu peux taper taper dans ton terminal :

echo $SHELL

Cela te renverra le shell utilisé dans le terminal en question. Tu peux ensuite mettre ce chemin dans le shebang au début de ton script et ça devrait fonctionner à l'identique.
Par défaut, plusieurs shells sont installés sur Ubuntu... et ils ont tous des comportements sensiblement différents ! C'est souvent source d'erreur...

Plus d'information sur les shells ici : https://doc.ubuntu-fr.org/shell

Bonne soirée,

Donut

Hors ligne

#4 Le 05/10/2016, à 19:46

MicP

Re : [Résolu]Différence entre commande directe et commande en script

Bonjour turblad

La première ligne de ton script contient un shebang
qui va permettre de savoir avec quel programme seront interprétées et exécutées
les commandes contenues dans le fichier script.

Ton script fonctionnera si le shebang est modifié pour :

#!/bin/bash

car ce sont des commandes bash que tu as utilisé dans ton script.

=======
Tu pourrais mettre cette ligne dans ton script avant tes commandes :

echo Le shell en cours d exécution est : $(readlink "/proc/$$/exe")

Ce qui permettra, selon le shebang, d'afficher :

Le shell en cours d exécution est : /bin/bash

ou bien :

Le shell en cours d exécution est : /bin/dash

=======
Pour information, sur debian et ububtu,
/bin/sh est un lien vers le programme /bin/dash

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 sept. 26 08:43 /bin/sh -> dash

=======
https://wiki.debian.org/fr/Shell

https://en.wikipedia.org/wiki/Compariso … and_shells

Dernière modification par MicP (Le 05/10/2016, à 20:11)

Hors ligne

#5 Le 05/10/2016, à 23:35

turblad

Re : [Résolu]Différence entre commande directe et commande en script

Bonsoir et merci de vos réponses.
Je me doutais bien de cette chose mais je n'avais jamais eu l'occasion de repérer la variable d'environnement $SHELL.
De plus, souvent, lorsque je fais des petits essais, je mets le shebang : /bin/bash ! Mais ce jour là, j'ai mis  /bin/sh parce que je venais de lire sur un site que cette option était préférable pour raison de plus grande compatibilité avec la plupart des Linux. Je savais d'ailleurs que sur Ubuntu, sh = dash. Mais voilà, on ne pense pas à tout. On peut d'ailleurs se demander quel est l'intérêt de garder les deux.
En attendant, j'avais trouvé la(les) commande compatible :

a=qsdfgh
c=`expr substr $a 3 3`
echo $c
d=$(expr substr $a 3 3)
echo $d

Ça fonctionne mais ça me parait moins joli ; de plus c'est indexé à partir de 1, ce qui fait bizarre en informatique.
Merci encore, j'aurai certainement à nouveau besoin de vous un de ces jours.


Il nous fallut bien du talent pour être vieux sans être adulte
Jacques Brel (chanson des vieux amants)

Hors ligne

#6 Le 06/10/2016, à 05:19

MicP

Re : [Résolu]Différence entre commande directe et commande en script

https://www.wikivs.com/wiki/Bash_vs_dash

=======
NOTE : Ne pas confondre

le dash (tableau de bord) d'Unity (Ubuntu)
et
le shell dash (Debian Almquist SHell)

Dernière modification par MicP (Le 06/10/2016, à 05:22)

Hors ligne