Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

for i in [A-Z] veut pas marcher

9 réponses
Avatar
Hugolino
Bonjour

Je cherche à faire un petit script. Pour vérifier je commence par faire:
for i in *.txt ;do echo $i;done
Ça marche.

Je cherche à faire une boucle sur les lettres:
for i in [A-Z];do echo $i;done
et ça répond:
[A-Z]

J'essaye:
for i in [[:alpha:]];do echo $i;done
et ça dit:
[[:alpha:]]

Le mieux que j'ai réussi à obtenir est:
for i in {A,Z};do echo $i;done
qui répond:
A
Z

Je relis la page de man de bash où il est expliqué (ligne 1354 si le
xterm fait 80 colonnes de large) dans la section 'Motifs génériques':
[...] Correspond à l'un des caractères entre crochets. Une
paire de caractères séparés par un signe "moins" indique un
intervalle; qui correspond à n'importe quel caractère situé
entre les deux bornes incluses.


PS: je suis sous GNU bash 2.05b et Debian

Merci de votre aide

--
> Je verrais bien un : "Julien in GLP - L'erreur est humaine", pas vous ?
Jean-Charles, débrouille-toi pour qu'il n'y est pas de confusion
possible au niveau des noms :) En plus, je suis pas seul ;)))
-+- Julien in guide du linuxien pervers - "Faut pas écorcher mes prénoms !"

9 réponses

Avatar
Stephane Chazelas
2004-07-28, 17:49(+02), Hugolino:
Je cherche à faire un petit script. Pour vérifier je commence par faire:
for i in *.txt ;do echo $i;done
Ça marche.

Je cherche à faire une boucle sur les lettres:
for i in [A-Z];do echo $i;done
et ça répond:
[A-Z]


Il n'y a probablement pas de fichier dont le nom est constitué
d'une seule lettre majuscule dans le present repertoire.

Avec bash 3.0:

for i in {A..Z}; do echo "$i"; done

Avec zsh:

for ((i=##A; i<=##Z; i++)) echo $(([##8]i))

ou:

for i ({$((##A))..$((##Z))}) echo $(([##8]i))

[...]
Je relis la page de man de bash où il est expliqué (ligne 1354 si le
xterm fait 80 colonnes de large) dans la section 'Motifs génériques':
[...] Correspond à l'un des caractères entre crochets. Une
paire de caractères séparés par un signe "moins" indique un
intervalle; qui correspond à n'importe quel caractère situé
entre les deux bornes incluses.
[...]


Oui, pour le globbing ou filename generation, ca retourne une
liste de fichiers pas des chaines de characteres arbitraires.

--
Stephane

Avatar
Hugolino
Le 28 Jul 2004 16:44:19 GMT, Stephane Chazelas a écrit:
Il n'y a probablement pas de fichier dont le nom est constitué
d'une seule lettre majuscule dans le present repertoire.


Oui bien sûr. Je m'attendais à ce que bash interprête les 26 lettres de
l'alphabet comme 26 arguments. Pas comme 26 nom de fichier.

Avec bash 3.0:

for i in {A..Z}; do echo "$i"; done


Autant dire qu'avec ma Debian, je ne suit pas prêt d'en disposer.


Avec zsh:
[snip]


Si je voulais installer zsh comme shell par défaut, quelle doc
devrais-je lire d'abord ? Mais maigre connaissance en bash (et les
scripts déjà écrit) seraient elles réutilisables ?


En tout cas merci de ton aide.


--
Hugo NPN (i --> ee)
On a droit au retour de Youpla et de SpaceWalker en un seul
Meta-Blaireau. Attention les gars, lancez les kill-files, celui-la,
c'est un dangeureux. -+- ST in CMM -+-

Avatar
Stephane Chazelas
2004-07-28, 21:54(+02), Hugolino:
[...]
for i in {A..Z}; do echo "$i"; done


Autant dire qu'avec ma Debian, je ne suit pas prêt d'en disposer.


Tu peux toujours faire:

awk 'BEGIN {for (i=0; i<26; i++) printf "%cn", i + 65}'

Ou ecrire des scripts perl plutot que des scripts shells.

Avec zsh:
[snip]


Si je voulais installer zsh comme shell par défaut, quelle doc
devrais-je lire d'abord ? Mais maigre connaissance en bash (et les
scripts déjà écrit) seraient elles réutilisables ?
[...]


Ce n'est generalement pas une bonne idee de changer le shell par
defaut (si ce que tu entends par shell par default est /bin/sh).

bash et zsh peuvent heureusement cohabiter sur une machine. Tes
scripts ecrits pour bash peuvent continuer a etre interpretés
par bash et tu peux ecrire des nouveaux scripts en zsh (ou des
fonctions autoloadables). Pour changer ton shell de login, chsh
ou passwd -s devraient suffire (avec l'adaptation des fichiers
de demarrage si necessaire).

--
Stephane


Avatar
Stephane Chazelas
2004-07-29, 16:23(+02), Rakotomandimby Mihamina:
[...]
Sur ma machine, root a gardé /bin/sh dans /etc/passwd
et moi, l'user normal, j'ai modifié directement mon shell dans /etc/passwd.
[...]

Pour quelle raison est ce que changer le shell dans /etc/passwd peut
etre dangereux ?
[...]


Par exemple, parce que l'installation d'un programme va rajouter
des lignes dans ~prg-admin-user/.profile (et pas dans .login)
parce qu'il s'attend a ce que prg-admin-user ait un shell Bourne
like.

Pour rsh aussi (et peut-etre ssh).

Si un programme fait un
rsh -l root la-machine "cmd > /dev/null 2>&1"

Ca ne marchera plus si tu mets csh comme shell de login a root
sur la-machine.

En cas de probleme, suivant le systeme, la distribution de
Linux, seuls certains shells peuvent etre prevus pour
fonctionner en mode degradé (par exemple, mode single user et
/usr/local/lib qui contient libncurses n'est pas monté...).

--
Stephane

Avatar
Rakotomandimby Mihamina
Stephane Chazelas wrote:
Ce n'est generalement pas une bonne idee de changer le shell par
defaut (si ce que tu entends par shell par default est /bin/sh).


Sur ma machine, root a gardé /bin/sh dans /etc/passwd
et moi, l'user normal, j'ai modifié directement mon shell dans /etc/passwd.

Je ne fais pas d'utilisation exotique de ma machine, et ca semble se
passe sans souci.

Pour quelle raison est ce que changer le shell dans /etc/passwd peut
etre dangereux ?

Daans la mesure ou dans la plupart des scripts lancés par cron (du moins
sur une Debian) overrident la variable SHELL ...

On peut donc (logiquement) en toute securité la personnaliser ! non ?
j'ai faux quelquepart ?
--
Rakotomandimby Mihamina Andrianifaharana
Tel : +33 2 38 76 43 65
http://www.rktmb.org/Members/mihamina

Avatar
manu
Rakotomandimby Mihamina wrote:

Pour quelle raison est ce que changer le shell dans /etc/passwd peut
etre dangereux ?


C'est pas dangereux si on ne fait pas n'importe quoi.
La commande vipw permet de l'editer et de beneficier d'une verification
après coup.

Il faut faire attention pour le shell de root: il doit être sur la
racine si on veut pouvoir utiliser le mode mono-utilisateur (où seule la
racine est montée).

--
Emmanuel Dreyfus
Un bouquin en français sur BSD:
http://www.eyrolles.com/Informatique/Livre/9782212114638/livre-bsd.php


Avatar
Stephane Chazelas
2004-07-28, 16:44(+00), Stephane Chazelas:
[...]
Je cherche à faire une boucle sur les lettres:
for i in [A-Z];do echo $i;done
et ça répond:
[A-Z]
[...]


Avec zsh:

for ((i=##A; i<=##Z; i++)) echo $(([##8]i))
[...]


Oups, j'avais oublié

setopt braceccl
print -l {A-Z}

--
Stephane


Avatar
DominiX
ici même:,
Stephane Chazelas a écrit
2004-07-28, 17:49(+02), Hugolino:
Je cherche à faire un petit script. Pour vérifier je commence par
faire: for i in *.txt ;do echo $i;done
Ça marche.

Je cherche à faire une boucle sur les lettres:
for i in [A-Z];do echo $i;done
et ça répond:
[A-Z]
[...]


Avec bash 3.0:

for i in {A..Z}; do echo "$i"; done

Avec zsh:

for ((i=##A; i<=##Z; i++)) echo $(([##8]i))

ou:

for i ({$((##A))..$((##Z))}) echo $(([##8]i))

[...]


perl -le 'print for A..Z'

-- dominix


Avatar
Jack Holborn
Le Wed, 28 Jul 2004 17:49:54 +0200, Hugolino a écrit :

Bonjour

Je cherche à faire un petit script. Pour vérifier je commence par faire:
for i in *.txt ;do echo $i;done
[...]
Merci de votre aide


Il n'est peut-etre pas trop tard pour repondre? :-)
Alors voila, ce joker est utilisé pour faire référence à des noms de
fichier. S'il n'y en a pas dans le répertoire courant bash le considere
comme un mot, d'où le résultat de la commande.
Pour t'aider à comprendre place-toi dans un repertoire qui ne contient
pas trop de fichiers et essaye ca:

for i in [a-z]*; do echo $i; done

ensuite fait la meme chose dans un repertoire vide........alors?

--
A+
Jack H.
"GNU bash 2.05b et Mandrake..."