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 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 utilisant

    l’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,



Le paragraphe II-1-2 a écrit :

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é. lol

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 smile
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

Watael a écrit :

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. wink


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 wink
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 smile

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 smile

Hors ligne

#25 Le 31/07/2023, à 12:58

kamaris

Re : Tuto scripts shell

Version POSIX big_smile

printf '%s' 'Entrez une suite de mots : '
read REPLY
set -- $REPLY
echo $#

Hors ligne