Bash variable $# [Réglé]

j-pierre42 Membre non connecté
-
- Voir le profil du membre j-pierre42
- Inscrit le : 07/04/2009
- Groupes :
dans un script exécuté sous bash, la variable $# devrait me retourner le nombre d'arguments passés sur la ligne de commande; or elle reste à 0.
Quelqu'un a la solution?
Merci et bon dimanche

ASUS 550-plus Processeur AMD; RAM 8Go, SSD 500Go
video ASUS GT730
Linux Mageia 8
video ASUS GT730
Linux Mageia 8


Adrien.D Membre non connecté
-
- Voir le profil du membre Adrien.D
- Inscrit le : 30/05/2011
- Site internet
- Groupes :
Code BASH :
5 [11:10:55] adrien@superlinux: ~/tmp $ ./hello.sh 4 4 4 4 4 Hello adrien ! Nous sommes le dim. sept. 20 11:11:00 CEST 2015 5 6 [11:11:00] adrien@superlinux: ~/tmp $ more hello.sh #!/bin/bash echo "Hello $(whoami) !" echo "Nous sommes le $(date)" echo $#
OK pour moi
Comment utilises-tu cette variable ?
Config : PC Fixe : X470 GAMING PRO- AMD Ryzen 5 2600X - 16Go RAM - Radeon RX 560 (Pilote libre) - Gentoo Linux - GNOME Desktop - Kernel 5.10 LTS
Ancien Webmaster de MageiaLinuxOnline. Les remplaçants assurent !
Ancien Webmaster de MageiaLinuxOnline. Les remplaçants assurent !


j-pierre42 Membre non connecté
-
- Voir le profil du membre j-pierre42
- Inscrit le : 07/04/2009
- Groupes :
rien compris à ton exemple, suis pas informaticien. J'apprends à utiliser la ligne de commande et je fais des essais (avec un bouquin)
Je voulais l'utiliser avec "read" pour saisir des paramètres sur la ligne de commande avec un script. En fait on parle d'arguments ce qui doit être différent, comment sont passés ces arguments?
Ça risque d'être un peu long à expliquer.

ASUS 550-plus Processeur AMD; RAM 8Go, SSD 500Go
video ASUS GT730
Linux Mageia 8
video ASUS GT730
Linux Mageia 8


Adrien.D Membre non connecté
-
- Voir le profil du membre Adrien.D
- Inscrit le : 30/05/2011
- Site internet
- Groupes :
Les arguments c'est ce que tu passes au script en plus, quand tu exécutes :
Code BASH :
./script.sh arg1 arg2 arg3
Dans mon exemple, j'ai fait
Code BASH :
./hello.sh 4 4 4 4 4
J'ai donc 5 paramètres et $# m'a bien renvoyé 5

Config : PC Fixe : X470 GAMING PRO- AMD Ryzen 5 2600X - 16Go RAM - Radeon RX 560 (Pilote libre) - Gentoo Linux - GNOME Desktop - Kernel 5.10 LTS
Ancien Webmaster de MageiaLinuxOnline. Les remplaçants assurent !
Ancien Webmaster de MageiaLinuxOnline. Les remplaçants assurent !


magnux77 Membre non connecté
-
- Voir le profil du membre magnux77
- Inscrit le : 21/09/2009
- Groupes :
-
Membre d'Honneur
j-pierre42 :
Je voulais l'utiliser avec "read" pour saisir des paramètres sur la ligne de commande avec un script.
Ah ! Je crois qu'il y a une petite confusion entre ligne de commande et ligne tout court.
Comme son nom l'indique une ligne de commande commence par une commande suivie de ses arguments, comme l'exemple montré par Adrien.D. Quand cette commande correspond à un script (comme l'exemple d'Adrien.D) les variables d'environnement suivantes sont renseignées : $* contient la ligne de commande avec ses arguments, $0 contient la commande elle-même, $1, $2, etc les arguments de cette commande et $# le nombre d'arguments. Point n'est besoin de la fonction read pour cela.
De l'autre côté la fonction read ne positionne pas la variable $#. Essaie le script suivant, tu verras
Code BASH :
while true do echo "Quoi ?" read R echo "$# éléments dans "$R"" echo "$(echo $R | wc -w) éléments dans "$R"" done
Pour sortir du script : Ctrl+C
Édité par magnux77 Le 21/09/2015 à 18h05
...depuis Mandrake 7
Membre de l'April - « promouvoir et défendre le Logiciel Libre»
Soutien Framasoft - « Changer le monde, un octet à la fois»
Config n°1 : cpu=AMD64x6 mem=16G SSD=64G HDD=1T OS=Mageia8-64 DE=Xfce, Config n°2 : Dell Latitude E6410 SSD=120G OS=Mageia8 DE=Xfce, Config n°3 : ThinkpadR40 SSD=32G OS=[Manjaro, Parabola, Mageia6] DE=Xfce, Config n°4 : EeePC901 SSD=20Gb, OS=[SliTaz5/Lxde, Mageia8/Xfce]
Membre de l'April - « promouvoir et défendre le Logiciel Libre»
Soutien Framasoft - « Changer le monde, un octet à la fois»
Config n°1 : cpu=AMD64x6 mem=16G SSD=64G HDD=1T OS=Mageia8-64 DE=Xfce, Config n°2 : Dell Latitude E6410 SSD=120G OS=Mageia8 DE=Xfce, Config n°3 : ThinkpadR40 SSD=32G OS=[Manjaro, Parabola, Mageia6] DE=Xfce, Config n°4 : EeePC901 SSD=20Gb, OS=[SliTaz5/Lxde, Mageia8/Xfce]

j-pierre42 Membre non connecté
-
- Voir le profil du membre j-pierre42
- Inscrit le : 07/04/2009
- Groupes :
Je sais pas si mon blabla vous est compréhensible. Merci pour le petit détail qui me manquait

ASUS 550-plus Processeur AMD; RAM 8Go, SSD 500Go
video ASUS GT730
Linux Mageia 8
video ASUS GT730
Linux Mageia 8


magnux77 Membre non connecté
-
- Voir le profil du membre magnux77
- Inscrit le : 21/09/2009
- Groupes :
-
Membre d'Honneur
j-pierre42 :
Tant mieux. Mais puisque tu as pris la peine de reformuler pour valider ta compréhension, je me permets de reprendre ce que tu as dit pour ne pas laisser trainer des inexactitudes.Merci, j'ai compris
j-pierre42 :
Plus précisément, l'interpréteur bash positionne systématiquement ces différentes variables. Libre à toi de les récupérer ou pas car elles ne sont pas toujours nécessaires.Les arguments du script sont passés à la suite sur la même ligne, dans ce cas $# est positionné et les arguments récupérés dans $1
j-pierre42 :
Non, car dans ce cas l'interpréteur ne fait rien. C'est à toi de tout programmer :Par contre si j'utilise read, les valeurs qui sont rentrées alors sont les arguments de la procédure read
- si les lignes sont variables, un "while read ligne" pour lire un fichier et un "for mot in $ligne" pour éplucher chaque ligne.
- si les lignes sont fixes, un "read mot1 mot2 mot3" suffit
Il est donc inexact de dire que les valeurs passées au read sont les arguments, ces valeurs sont passées par l'intermédiaire de variables que tu gères.
j-pierre42 :
Ce parallèle est inexact puisque comme je l'indiquais précédemment, le read n'a aucun argument traité par l'interpréteur. Par contre, pour le parallèle avec les langages, tu peux utiliser des fonctions internes à ton shell script.faire un parallèle aux paramètres passés à une procédure dans les langages comme C par ex
Code BASH :
A l'appel de cette fonction l'interpréteur positionne les variables $*, $#, $1, $2...nom function { ... }
Hope it helps
Édité par magnux77 Le 22/09/2015 à 11h56
...depuis Mandrake 7
Membre de l'April - « promouvoir et défendre le Logiciel Libre»
Soutien Framasoft - « Changer le monde, un octet à la fois»
Config n°1 : cpu=AMD64x6 mem=16G SSD=64G HDD=1T OS=Mageia8-64 DE=Xfce, Config n°2 : Dell Latitude E6410 SSD=120G OS=Mageia8 DE=Xfce, Config n°3 : ThinkpadR40 SSD=32G OS=[Manjaro, Parabola, Mageia6] DE=Xfce, Config n°4 : EeePC901 SSD=20Gb, OS=[SliTaz5/Lxde, Mageia8/Xfce]
Membre de l'April - « promouvoir et défendre le Logiciel Libre»
Soutien Framasoft - « Changer le monde, un octet à la fois»
Config n°1 : cpu=AMD64x6 mem=16G SSD=64G HDD=1T OS=Mageia8-64 DE=Xfce, Config n°2 : Dell Latitude E6410 SSD=120G OS=Mageia8 DE=Xfce, Config n°3 : ThinkpadR40 SSD=32G OS=[Manjaro, Parabola, Mageia6] DE=Xfce, Config n°4 : EeePC901 SSD=20Gb, OS=[SliTaz5/Lxde, Mageia8/Xfce]

magnux77 Membre non connecté
-
- Voir le profil du membre magnux77
- Inscrit le : 21/09/2009
- Groupes :
-
Membre d'Honneur
Code BASH :
while read ligne do echo "Cette ligne contient $(echo "$ligne" | wc -w) mots." done
...depuis Mandrake 7
Membre de l'April - « promouvoir et défendre le Logiciel Libre»
Soutien Framasoft - « Changer le monde, un octet à la fois»
Config n°1 : cpu=AMD64x6 mem=16G SSD=64G HDD=1T OS=Mageia8-64 DE=Xfce, Config n°2 : Dell Latitude E6410 SSD=120G OS=Mageia8 DE=Xfce, Config n°3 : ThinkpadR40 SSD=32G OS=[Manjaro, Parabola, Mageia6] DE=Xfce, Config n°4 : EeePC901 SSD=20Gb, OS=[SliTaz5/Lxde, Mageia8/Xfce]
Membre de l'April - « promouvoir et défendre le Logiciel Libre»
Soutien Framasoft - « Changer le monde, un octet à la fois»
Config n°1 : cpu=AMD64x6 mem=16G SSD=64G HDD=1T OS=Mageia8-64 DE=Xfce, Config n°2 : Dell Latitude E6410 SSD=120G OS=Mageia8 DE=Xfce, Config n°3 : ThinkpadR40 SSD=32G OS=[Manjaro, Parabola, Mageia6] DE=Xfce, Config n°4 : EeePC901 SSD=20Gb, OS=[SliTaz5/Lxde, Mageia8/Xfce]

j-pierre42 Membre non connecté
-
- Voir le profil du membre j-pierre42
- Inscrit le : 07/04/2009
- Groupes :

ASUS 550-plus Processeur AMD; RAM 8Go, SSD 500Go
video ASUS GT730
Linux Mageia 8
video ASUS GT730
Linux Mageia 8

Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie