#1 Le 30/07/2023, à 10:55
- Chaosphere
Tuto scripts shell
Bonjour je suis en train de faire un tuto sur les scripts shell (https://eric-sanchis.developpez.com/lin … es#LII-2-1)
Et je bloque au paragraphe "II-2-2. Paramètres spéciaux", exercice 3 :
Exercice 3 :
Ecrire un programme shell nbmots qui demande à l'utilisateur de saisir une suite quelconque de mots puis affiche le nombre de mots saisis.
$ nbmots
Entrez une suite de mots : un deux trois quatre cinq
5 => 5 mots ont été saisis
$
Je ne vois pas comment utiliser la variable $# pour compter le nombre de mots saisit par l'utilisateur...
Hors ligne
#2 Le 30/07/2023, à 12:26
- Watael
Re : Tuto scripts shell
salut,
montre-nous ton script.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 30/07/2023, à 12:36
- MicP
Re : Tuto scripts shell
Bonjour
Extrait de II-1. Variables :
…
L’utilisateur peut affecter une valeur à une variable en utilisantl’opérateur d’affectation =
la commande interne read.
…
Donc, cherche la commande read dans le manuel du shell bash
Pour faire s'afficher directement la page du manuel concernant la commande read du bash
entre la ligne de commande suivante :
man --pager='less -p "read \["' bash
=======
Tu trouveras quelques exemples d'utilisation de la commande read au chapitre : II-1-2. Affectation par lecture
Dernière modification par MicP (Le 30/07/2023, à 12:43)
Hors ligne
#4 Le 30/07/2023, à 12:47
- nany
Re : Tuto scripts shell
Bonjour,
Lorsque la commande interne read est utilisée sans argument, la ligne lue est enregistrée dans la variable prédéfinie du shell REPLY.
$ read bonjour tout le monde $ $ echo $REPLY bonjour tout le monde $
Après, il faut connaître la commande qui permet de compter les mots.
Overgrilled!
Dernière modification par nany (Le 30/07/2023, à 12:48)
En ligne
#5 Le 30/07/2023, à 12:49
- Watael
Re : Tuto scripts shell
il n'y a pas besoin de commande pour afficher le nombre de "mots" d'une chaîne; il faut savoir utiliser ${#}. Les accolades sont mises à dessein pour aiguiller le PO.
hop hop hop ! je confonds le nombre de mots et le nombre de caractères !
en fait, # va afficher le nombre de caractères d'une chaîne, mais affichera le nombre d'éléments d'un tableau :
$ v="bla bla bla"
$ echo ${#v}
11
$ a=( $(IFS=' '; echo $v) )
$ echo ${#a[*]}
3
$
donc, on lit les mots dans un tableau, et on en affiche le nombre d'éléments.
Dernière modification par Watael (Le 30/07/2023, à 13:04)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 30/07/2023, à 15:18
- diesel
Re : Tuto scripts shell
echo $#
dans le fichier "nbmots" rendu exécutable
jean-marie@jean-marie : ~$ ./ndmots toto tutu titi tata
4
ean-marie@jean-marie : ~$
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 30/07/2023, à 15:24)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
En ligne
#7 Le 30/07/2023, à 15:27
- Watael
Re : Tuto scripts shell
il est énoncé que le script doit proposer de lire les données :
Écrire un programme [...] qui demande [...] de saisir une suite quelconque de mots
il ne s'agit pas de donner le nombre de paramètres du script.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 30/07/2023, à 15:32
- diesel
Re : Tuto scripts shell
Ffectivement.
Je me suis laissé abuser par le titre de l'exercice : paragraphe "II-2-2. Paramètres spéciaux", exercice 3.
Et le man bash donne :
Paramètres spéciaux
L'interpréteur traite plusieurs paramètres spécifiquement. Ces paramètres peuvent uniquement être consultés, il n'est pas permis de leur affecter une valeur.
*
Se développe en ensemble des paramètres positionnels, commençant par le premier. Quand le développement n’est pas entre guillemets doubles, tous les paramètres positionnels se développent en mots séparés. Dans les contextes où il sont réalisés, ces mots sont soumis à d’autres découpages de mot et développements de chemin. Quand le développement se produit entre des guillemets doubles, * se transforme en un seul mot constitué de la valeur de tous les paramètres positionnels séparés par le premier caractère de la variable spéciale IFS. C'est-à-dire que "$*" est équivalent à "$1c$2c...", où c est le premier caractère de la valeur de la variable IFS. Si IFS est inexistante, les paramètres sont séparés par des espaces. Si IFS est NULL, les paramètres sont accolés sans séparateurs.
@
Se développe en ensemble des paramètres positionnels, commençant par le premier. Quand le développement a lieu entre guillemets doubles, chaque paramètre se développe en un mot distinct. C'est-à-dire que "$@" est équivalent à "$1" "$2" .... Si le développement des guillemets doubles survient dans un mot, le développement du premier paramètre est accolé à la première partie du mot d'origine et le développement du dernier paramètre est accolé à la dernière partie du mot d'origine. Quand il n'y a pas de paramètres positionnels, "$@" et $@ ne se développent en rien (c'est-à-dire qu'ils sont simplement éliminés).
#
Correspond au nombre de paramètres positionnels, en base décimale.
...
D'où ma réponse.
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 30/07/2023, à 15:41)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
En ligne
#9 Le 30/07/2023, à 17:38
- Watael
Re : Tuto scripts shell
ta réponse est parfaitement correcte
pour un autre énoncé.
d'ailleurs, j'ai proposé de passer par un tableau, mais ta réponse me suggère qu'on peut passer par une fonction, pour pouvoir être strictement POSIX.
Dernière modification par Watael (Le 30/07/2023, à 17:39)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#10 Le 30/07/2023, à 18:17
- MicP
Re : Tuto scripts shell
Peut-être comme ça :
EDIT : Corrigé en suivant les conseils donnés dans le message de Watael
#!/bin/sh
affNbrMots() {
printf '%d %s\n' $# "mots ont été entrés."
}
printf '%s' "Entrez une suite de mots : "
read mesMots
affNbrMots $mesMots
et le même, mais en utilisant la commande echo au lieu de printf
#!/bin/sh
affNbrMots() {
echo "$# mots ont été entrés."
}
echo -n "Entrez une suite de mots : "
read mesMots
affNbrMots $mesMots
Dernière modification par MicP (Le 30/07/2023, à 22:51)
Hors ligne
#11 Le 30/07/2023, à 18:55
- Watael
Re : Tuto scripts shell
c'est à ça que m'a fait pensé la réponse de diesel.
par contre
printf '%d mots ont été entrés.\n' $#
printf sert à "séparer" le format d'affichage des données à afficher.
sinon un simple echo aurait convenu.
Dernière modification par Watael (Le 30/07/2023, à 18:57)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#12 Le 30/07/2023, à 18:56
- MicP
Re : Tuto scripts shell
Ok, merci beaucoup pour tes conseils
Je corrige de suite mon précédent message.
Dernière modification par MicP (Le 30/07/2023, à 19:13)
Hors ligne
#13 Le 31/07/2023, à 07:06
- serged
Re : Tuto scripts shell
il n'y a pas besoin de commande pour afficher le nombre de "mots" d'une chaîne; il faut savoir utiliser ${#}. Les accolades sont mises à dessein pour aiguiller le PO.
hop hop hop ! je confonds le nombre de mots et le nombre de caractères !
et wc ?
wc --help
Utilisation : wc [OPTION]... [FICHIER]...
ou : wc [OPTION]... --files0-from=F
Afficher le nombre de sauts de ligne, de mots et d'octets pour chaque FICHIER
et une ligne totale si plus d'un fichier est spécifié. Un mot est une séquence
de taille non nulle de caractères délimités par une espace.
Sans FICHIER ou quand FICHIER est -, lire l'entrée standard.
Les options ci-dessous permettent de sélectionner les compteurs à afficher,
qui sont toujours utilisés dans l'ordre suivant : saut de ligne, mot, caractère,
octet, longueur de ligne maximale.
-c, --bytes afficher le nombre d'octets
-m, --chars afficher le nombre de caractères
-l, --lines afficher le nombre de sauts de lignes
--files0-from=F lire l'entrée depuis les fichiers indiqués par
des noms terminant par NUL dans le fichier F
-L, --max-line-length afficher la largeur maximale d'affichage
-w, --words afficher le nombre de mots
--help afficher l'aide et quitter
--version afficher des informations de version et quitter
Donc :
echo vous avez dit ?
read
echo $REPLY|wc -w
(à formatter la réponse)
Dernière modification par serged (Le 31/07/2023, à 07:11)
LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)
Hors ligne
#14 Le 31/07/2023, à 07:29
- Chaosphere
Re : Tuto scripts shell
Hello,
Désolé j'ai pas eu le temps de vous répondre hier... Merci pour vos messages
Je pense que le problème c'est surtout l'énoncé de l'exo qui est pas logique. Le paragraphe II-2-2 parle de la variable $# je pensais qu'il fallait faire cet exercice en utilisant $#. r ce n'est pas possible visiblement.
Donc j'avais éssayé un truc comme ca :
#!/bin/bash
read -p "Saisissez des mots : " mot1 mot2 mot3 mot4
# Utilise "$#" pour obtenir le nombre total de mots saisis
nombre_de_mots_saisis=$#
# Affichage du nombre de mots saisis par l'utilisateur
echo "Nombre de mots saisis : $nombre_de_mots_saisis"
Evidemment ca, ca ne fonctionne pas...
du coup je pense avoir trouvé une solution simple à l'exercice (et je vois que Serged à trouvé la même solution d'ailleurs) mais je bloque cette fois sur la syntaxe :
#!/bin/bash
read -p "Saisissez des mots : "
# Utilise "$#" pour obtenir le nombre total de mots saisis
nombre_de_mots_saisis=$(echo $REPLY|wc -w)
# Affichage du nombre de mots saisis par l'utilisateur
echo "Nombre de mots saisis : $nombre_de_mots_saisis"
Hors ligne
#15 Le 31/07/2023, à 07:37
- Chaosphere
Re : Tuto scripts shell
Bon ca y est j'ai trouvé mon erreur de syntaxe :
#!/bin/bash
read -p "Saisissez des mots : "
# Utilise "$#" pour obtenir le nombre total de mots saisis
nombre_de_mots_saisis=$(echo "$REPLY" | wc -w)
# Affichage du nombre de mots saisis par l'utilisateur
echo "Nombre de mots saisis : $nombre_de_mots_saisis"
J'avais pas mis les guillemets autour de $REPLY
Pas facile la syntaxe du bash je trouve...
Hors ligne
#16 Le 31/07/2023, à 07:56
- Hizoka
Re : Tuto scripts shell
Salut, c'est une syntaxe très facile au contraire je trouve.
La règle, c'est que tu entours toujours les variables de " sauf si tu sais pourquoi tu ne le fais pas.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#17 Le 31/07/2023, à 08:14
- Chaosphere
Re : Tuto scripts shell
La règle c'est d'entourer les variables avec des guillemets c'est bien ca ?
Hors ligne
#18 Le 31/07/2023, à 09:54
- kamaris
Re : Tuto scripts shell
Pas besoin de commande externe, ni de tableau :
read -p 'Entrez une suite de mots : '
set -- $REPLY
echo $#
Hors ligne
#19 Le 31/07/2023, à 10:24
- Watael
Re : Tuto scripts shell
oui, en espérant qu'il n'y a pas de paramètres positionnels à traiter.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#20 Le 31/07/2023, à 10:52
- kamaris
Re : Tuto scripts shell
C'est un exercice
Au passage, version POSIX :
read -p 'Entrez une suite de mots : ' REPLY
set -- $REPLY
echo $#
Hors ligne
#21 Le 31/07/2023, à 12:11
- MicP
Re : Tuto scripts shell
Bonjour
J'ai toujours cru que l'option p et la variable REPLY
n'existaient pas dans la version POSIX de la commande read.
Me serais-je trompé ?
Hors ligne
#22 Le 31/07/2023, à 12:18
- kamaris
Re : Tuto scripts shell
-p existe dans dash que je prends abusivement comme implémentation de référence de la norme POSIX.
Par contre REPLY n'existe pas, et la variable en argument de read n'est donc pas optionnelle, d'où son ajout ci-dessus.
Hors ligne
#23 Le 31/07/2023, à 12:25
- kamaris
Re : Tuto scripts shell
Ça fait apparemment partie des petits points sur lesquels dash déroge à la norme POSIX : https://bugs.debian.org/cgi-bin/bugrepo … bug=510354
Donc oui, tu as raison, -p n'est définitivement pas POSIX
Dernière modification par kamaris (Le 31/07/2023, à 12:26)
Hors ligne
#24 Le 31/07/2023, à 12:52
- MicP
Re : Tuto scripts shell
Merci
Hors ligne
#25 Le 31/07/2023, à 12:58
- kamaris
Re : Tuto scripts shell
Version POSIX
printf '%s' 'Entrez une suite de mots : '
read REPLY
set -- $REPLY
echo $#
Hors ligne