J'ai plusieurs fichiers de configuration contenant (entre autre)
une variable $NOM et une autre $COMMENTAIRE.
Je souhaite mettre en place un script dialog --menu qui me permette de
choisir un de ces fichiers.
J'utilise un:
for gloup in *cfg
do
source $gloup
echo $NOM $COMMENTAIRE >> choices
done
dialog --backtitle 1 --title 2 \
--menu "
test:" 18 60 6 \
`cat choices` \
"Abandon" "Quitter le prog" 2 > fich-temp
Mais ca ne fonctionne absolument pas.
La variable $NOM ne fait qu'un caractere, mais $COMMENTAIRE en fait
plusieurs.
Si j'ai:
NOM=test1
COMMENTAIRE=ceci est un commentaire
mon script dialog affiche:
test1 ceci
est un
commentaire
au lieu de:
test1 ceci est un commentaire
Je me doute qu'il s'agit d'un probleme de separateur, j'ai teste en ajoutant
des " des ' des \ en modifiant IFS, en utilisant printf au lieu d'echo mais
pas moyen, dialog considere que chaque mot est une nouvelle entree.
(Bien evidemment, si COMMENTAIRE ne contient pas d'espace, tout fonctionne
correctement.)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Pascal Bourguignon
Kevin Denis writes:
Bonjour,
J'ai un probleme a resoudre avec dialog et bash.
J'ai plusieurs fichiers de configuration contenant (entre autre) une variable $NOM et une autre $COMMENTAIRE.
Je souhaite mettre en place un script dialog --menu qui me permette de choisir un de ces fichiers.
J'utilise un: for gloup in *cfg do source $gloup echo $NOM $COMMENTAIRE >> choices done dialog --backtitle 1 --title 2 --menu " test:" 18 60 6 `cat choices` "Abandon" "Quitter le prog" 2 > fich-temp
Mais ca ne fonctionne absolument pas.
La variable $NOM ne fait qu'un caractere, mais $COMMENTAIRE en fait plusieurs. Si j'ai: NOM=test1 COMMENTAIREÎci est un commentaire
#!/bin/bash choices=() for gloup in *.cfg ; do source $gloup choices[${#choices[@]}]="$NOM" choices[${#choices[@]}]="$COMMENTAIRE" done dialog --backtitle "Back Title" --title "TITLE" --menu " test:" 18 60 6 "${choices[@]}" "Abandon" "Quitter le prog" 2> fich-temp
### NE PAS SÉPARER le 2 du > : 2 > n'est pas 2> !!!
Comment resoudre le probleme?
En évitant de passer par des fichiers externes ou de forker des sous-processus: c'est inefficace: man bash (ou mieux, programmer ses scripts en lisp!)
-- __Pascal Bourguignon__ http://www.informatimago.com/ Until real software engineering is developed, the next best practice is to develop with a dynamic system that has extreme late binding in all aspects. The first system to really do this in an important way is Lisp. -- Alan Kay
Kevin Denis <kevin@nowhere.invalid> writes:
Bonjour,
J'ai un probleme a resoudre avec dialog et bash.
J'ai plusieurs fichiers de configuration contenant (entre autre)
une variable $NOM et une autre $COMMENTAIRE.
Je souhaite mettre en place un script dialog --menu qui me permette de
choisir un de ces fichiers.
J'utilise un:
for gloup in *cfg
do
source $gloup
echo $NOM $COMMENTAIRE >> choices
done
dialog --backtitle 1 --title 2
--menu "
test:" 18 60 6
`cat choices`
"Abandon" "Quitter le prog" 2 > fich-temp
Mais ca ne fonctionne absolument pas.
La variable $NOM ne fait qu'un caractere, mais $COMMENTAIRE en fait
plusieurs.
Si j'ai:
NOM=test1
COMMENTAIREÎci est un commentaire
#!/bin/bash
choices=()
for gloup in *.cfg ; do
source $gloup
choices[${#choices[@]}]="$NOM"
choices[${#choices[@]}]="$COMMENTAIRE"
done
dialog --backtitle "Back Title" --title "TITLE"
--menu "
test:" 18 60 6
"${choices[@]}"
"Abandon" "Quitter le prog"
2> fich-temp
### NE PAS SÉPARER le 2 du > : 2 > n'est pas 2> !!!
Comment resoudre le probleme?
En évitant de passer par des fichiers externes ou de forker des
sous-processus: c'est inefficace: man bash
(ou mieux, programmer ses scripts en lisp!)
--
__Pascal Bourguignon__ http://www.informatimago.com/
Until real software engineering is developed, the next best practice
is to develop with a dynamic system that has extreme late binding in
all aspects. The first system to really do this in an important way
is Lisp. -- Alan Kay
J'ai plusieurs fichiers de configuration contenant (entre autre) une variable $NOM et une autre $COMMENTAIRE.
Je souhaite mettre en place un script dialog --menu qui me permette de choisir un de ces fichiers.
J'utilise un: for gloup in *cfg do source $gloup echo $NOM $COMMENTAIRE >> choices done dialog --backtitle 1 --title 2 --menu " test:" 18 60 6 `cat choices` "Abandon" "Quitter le prog" 2 > fich-temp
Mais ca ne fonctionne absolument pas.
La variable $NOM ne fait qu'un caractere, mais $COMMENTAIRE en fait plusieurs. Si j'ai: NOM=test1 COMMENTAIREÎci est un commentaire
#!/bin/bash choices=() for gloup in *.cfg ; do source $gloup choices[${#choices[@]}]="$NOM" choices[${#choices[@]}]="$COMMENTAIRE" done dialog --backtitle "Back Title" --title "TITLE" --menu " test:" 18 60 6 "${choices[@]}" "Abandon" "Quitter le prog" 2> fich-temp
### NE PAS SÉPARER le 2 du > : 2 > n'est pas 2> !!!
Comment resoudre le probleme?
En évitant de passer par des fichiers externes ou de forker des sous-processus: c'est inefficace: man bash (ou mieux, programmer ses scripts en lisp!)
-- __Pascal Bourguignon__ http://www.informatimago.com/ Until real software engineering is developed, the next best practice is to develop with a dynamic system that has extreme late binding in all aspects. The first system to really do this in an important way is Lisp. -- Alan Kay
Kevin Denis
Le 07-07-2005, Pascal Bourguignon a écrit :
J'ai un probleme a resoudre avec dialog et bash.
J'ai plusieurs fichiers de configuration contenant (entre autre) une variable $NOM et une autre $COMMENTAIRE.
Je souhaite mettre en place un script dialog --menu qui me permette de choisir un de ces fichiers.
Mais ca ne fonctionne absolument pas.
La variable $NOM ne fait qu'un caractere, mais $COMMENTAIRE en fait plusieurs. Si j'ai: NOM=test1 COMMENTAIREÎci est un commentaire
#!/bin/bash choices=() for gloup in *.cfg ; do source $gloup choices[${#choices[@]}]="$NOM" choices[${#choices[@]}]="$COMMENTAIRE" done dialog --backtitle "Back Title" --title "TITLE" --menu " test:" 18 60 6 "${choices[@]}" "Abandon" "Quitter le prog" 2> fich-temp
Mais ce script ne fonctionne pas comme attendu (?)
1.cfg NOM=un COMMENTAIRE=un commentaire
2.cfg NOMÞux COMMENTAIRE=tagada_hop_hop_hop
3.cfg NOM=trois COMMENTAIRE=un poisson qui fait du velo
M'affiche:
un deux tagada_hop_hop_hop trois tagada_hop_hop_hop Abandon Quitter le prog
Comment resoudre le probleme?
En évitant de passer par des fichiers externes ou de forker des sous-processus: c'est inefficace: man bash
ah, bah alors, j'ai une autre question.
J'ai des options (pas forcement toute renseignees ou obligatoires), genre PROG=prog OPT1P OPT2=tagada OPT3 OPT4=-s
et je souhaite avoir une ligne de commande prog -n 50 -opt=tagada -s
Je fais une serie de (les ames sensibles peuvent fermer les yeux): echo -n "$PROG " > go if [ -n "$OPT1" ]; then echo -n " -n $OPT1 " >> go; fi if [ -n "$OPT2" ]; then echo -n " -opt=$OPT2 " >> go; fi if [ -n "$OPT3" ]; then echo -n " -p $OPT3 " >> go; fi if [ -n "$OPT4" ]; then echo -n " $OPT4 " >> go; fi echo "" >> go GO=`cat go` $GO &
A l'usage, ca fonctionne bien, mais ca me parait quand meme un peu goret: passer par un fichier, puis la variable. Une idee pour ameliorer le truc?
(ou mieux, programmer ses scripts en lisp!)
On va deja commencer par bash.
-- Kevin
Le 07-07-2005, Pascal Bourguignon <pjb@informatimago.com> a écrit :
J'ai un probleme a resoudre avec dialog et bash.
J'ai plusieurs fichiers de configuration contenant (entre autre)
une variable $NOM et une autre $COMMENTAIRE.
Je souhaite mettre en place un script dialog --menu qui me permette de
choisir un de ces fichiers.
Mais ca ne fonctionne absolument pas.
La variable $NOM ne fait qu'un caractere, mais $COMMENTAIRE en fait
plusieurs.
Si j'ai:
NOM=test1
COMMENTAIREÎci est un commentaire
#!/bin/bash
choices=()
for gloup in *.cfg ; do
source $gloup
choices[${#choices[@]}]="$NOM"
choices[${#choices[@]}]="$COMMENTAIRE"
done
dialog --backtitle "Back Title" --title "TITLE"
--menu "
test:" 18 60 6
"${choices[@]}"
"Abandon" "Quitter le prog"
2> fich-temp
Mais ce script ne fonctionne pas comme attendu (?)
1.cfg
NOM=un
COMMENTAIRE=un commentaire
2.cfg
NOMÞux
COMMENTAIRE=tagada_hop_hop_hop
3.cfg
NOM=trois
COMMENTAIRE=un poisson qui fait du velo
M'affiche:
un
deux tagada_hop_hop_hop
trois tagada_hop_hop_hop
Abandon Quitter le prog
Comment resoudre le probleme?
En évitant de passer par des fichiers externes ou de forker des
sous-processus: c'est inefficace: man bash
ah, bah alors, j'ai une autre question.
J'ai des options (pas forcement toute renseignees ou obligatoires), genre
PROG=prog
OPT1P
OPT2=tagada
OPT3 OPT4=-s
et je souhaite avoir une ligne de commande
prog -n 50 -opt=tagada -s
Je fais une serie de (les ames sensibles peuvent fermer les yeux):
echo -n "$PROG " > go
if [ -n "$OPT1" ]; then echo -n " -n $OPT1 " >> go; fi
if [ -n "$OPT2" ]; then echo -n " -opt=$OPT2 " >> go; fi
if [ -n "$OPT3" ]; then echo -n " -p $OPT3 " >> go; fi
if [ -n "$OPT4" ]; then echo -n " $OPT4 " >> go; fi
echo "" >> go
GO=`cat go`
$GO &
A l'usage, ca fonctionne bien, mais ca me parait quand meme un peu
goret: passer par un fichier, puis la variable.
Une idee pour ameliorer le truc?
J'ai plusieurs fichiers de configuration contenant (entre autre) une variable $NOM et une autre $COMMENTAIRE.
Je souhaite mettre en place un script dialog --menu qui me permette de choisir un de ces fichiers.
Mais ca ne fonctionne absolument pas.
La variable $NOM ne fait qu'un caractere, mais $COMMENTAIRE en fait plusieurs. Si j'ai: NOM=test1 COMMENTAIREÎci est un commentaire
#!/bin/bash choices=() for gloup in *.cfg ; do source $gloup choices[${#choices[@]}]="$NOM" choices[${#choices[@]}]="$COMMENTAIRE" done dialog --backtitle "Back Title" --title "TITLE" --menu " test:" 18 60 6 "${choices[@]}" "Abandon" "Quitter le prog" 2> fich-temp
Mais ce script ne fonctionne pas comme attendu (?)
1.cfg NOM=un COMMENTAIRE=un commentaire
2.cfg NOMÞux COMMENTAIRE=tagada_hop_hop_hop
3.cfg NOM=trois COMMENTAIRE=un poisson qui fait du velo
M'affiche:
un deux tagada_hop_hop_hop trois tagada_hop_hop_hop Abandon Quitter le prog
Comment resoudre le probleme?
En évitant de passer par des fichiers externes ou de forker des sous-processus: c'est inefficace: man bash
ah, bah alors, j'ai une autre question.
J'ai des options (pas forcement toute renseignees ou obligatoires), genre PROG=prog OPT1P OPT2=tagada OPT3 OPT4=-s
et je souhaite avoir une ligne de commande prog -n 50 -opt=tagada -s
Je fais une serie de (les ames sensibles peuvent fermer les yeux): echo -n "$PROG " > go if [ -n "$OPT1" ]; then echo -n " -n $OPT1 " >> go; fi if [ -n "$OPT2" ]; then echo -n " -opt=$OPT2 " >> go; fi if [ -n "$OPT3" ]; then echo -n " -p $OPT3 " >> go; fi if [ -n "$OPT4" ]; then echo -n " $OPT4 " >> go; fi echo "" >> go GO=`cat go` $GO &
A l'usage, ca fonctionne bien, mais ca me parait quand meme un peu goret: passer par un fichier, puis la variable. Une idee pour ameliorer le truc?
(ou mieux, programmer ses scripts en lisp!)
On va deja commencer par bash.
-- Kevin
Pascal Bourguignon
Kevin Denis writes:
Le 07-07-2005, Pascal Bourguignon a écrit :
J'ai un probleme a resoudre avec dialog et bash.
J'ai plusieurs fichiers de configuration contenant (entre autre) une variable $NOM et une autre $COMMENTAIRE.
Je souhaite mettre en place un script dialog --menu qui me permette de choisir un de ces fichiers.
Mais ca ne fonctionne absolument pas.
La variable $NOM ne fait qu'un caractere, mais $COMMENTAIRE en fait plusieurs. Si j'ai: NOM=test1 COMMENTAIREÎci est un commentaire
#!/bin/bash choices=() for gloup in *.cfg ; do source $gloup choices[${#choices[@]}]="$NOM" choices[${#choices[@]}]="$COMMENTAIRE" done dialog --backtitle "Back Title" --title "TITLE" --menu " test:" 18 60 6 "${choices[@]}" "Abandon" "Quitter le prog" 2> fich-temp
Mais ce script ne fonctionne pas comme attendu (?)
1.cfg NOM=un COMMENTAIRE=un commentaire
Et moi, je m'attendais à ce que tu mettes:
COMMENTAIRE="un commentaire"
Si tu insiste pour
COMMENTAIRE=un commentaire
alors il me semble que IFS ne servira à rien ici.
Pour les currieux: IFS ne sert qu'à couper les arguments d'une commandes, et dans: COMMENTAIRE=un commentaire avec plusieurs espace ^ ^ ^ ^ ^ | | | | | | | | | +-- IFS | | | | | | | +--- argument | | | | | +-- commande | | +--variable +-- valeur
Comme toujours: man bash
IFS The Internal Field Separator that is used for word split ting after expansion and to split lines into words with the read builtin command. The default value is ``<space><tab><newline>''.
Il faudra remplacer ("programmer"!) source "$gloup" par:
while read line ; do case "$line" in NOM=.*) NOM="${line/NOM=}" ;; COMMENTAIRE=.*) COMMENTAIRE="${line/COMMENTAIRE=}" ;; *) echo "${gloup}: Ligne de configuration invalide:" echo "$line" exit 1 ;; esac done < "$gloup"
ah, bah alors, j'ai une autre question.
J'ai des options (pas forcement toute renseignees ou obligatoires), genre PROG=prog OPT1P OPT2=tagada OPT3 > OPT4=-s
et je souhaite avoir une ligne de commande prog -n 50 -opt=tagada -s
Je fais une serie de (les ames sensibles peuvent fermer les yeux): echo -n "$PROG " > go if [ -n "$OPT1" ]; then echo -n " -n $OPT1 " >> go; fi if [ -n "$OPT2" ]; then echo -n " -opt=$OPT2 " >> go; fi if [ -n "$OPT3" ]; then echo -n " -p $OPT3 " >> go; fi if [ -n "$OPT4" ]; then echo -n " $OPT4 " >> go; fi echo "" >> go GO=`cat go` $GO &
A l'usage, ca fonctionne bien, mais ca me parait quand meme un peu goret: passer par un fichier, puis la variable. Une idee pour ameliorer le truc?
Oui. À quoi ça sert que Ducros se décarcasse? Tu n'apprends rien? Relis mon message précédent que tu as si bien cité ci-dessus!
Et à l'usage ça merde quand une des options contient des blancs.
Le 07-07-2005, Pascal Bourguignon <pjb@informatimago.com> a écrit :
J'ai un probleme a resoudre avec dialog et bash.
J'ai plusieurs fichiers de configuration contenant (entre autre)
une variable $NOM et une autre $COMMENTAIRE.
Je souhaite mettre en place un script dialog --menu qui me permette de
choisir un de ces fichiers.
Mais ca ne fonctionne absolument pas.
La variable $NOM ne fait qu'un caractere, mais $COMMENTAIRE en fait
plusieurs.
Si j'ai:
NOM=test1
COMMENTAIREÎci est un commentaire
#!/bin/bash
choices=()
for gloup in *.cfg ; do
source $gloup
choices[${#choices[@]}]="$NOM"
choices[${#choices[@]}]="$COMMENTAIRE"
done
dialog --backtitle "Back Title" --title "TITLE"
--menu "
test:" 18 60 6
"${choices[@]}"
"Abandon" "Quitter le prog"
2> fich-temp
Mais ce script ne fonctionne pas comme attendu (?)
1.cfg
NOM=un
COMMENTAIRE=un commentaire
Et moi, je m'attendais à ce que tu mettes:
COMMENTAIRE="un commentaire"
Si tu insiste pour
COMMENTAIRE=un commentaire
alors il me semble que IFS ne servira à rien ici.
Pour les currieux: IFS ne sert qu'à couper les arguments d'une
commandes, et dans:
COMMENTAIRE=un commentaire avec plusieurs espace
^ ^ ^ ^ ^
| | | | |
| | | | +-- IFS
| | | |
| | | +--- argument
| | |
| | +-- commande
| |
+--variable +-- valeur
Comme toujours: man bash
IFS The Internal Field Separator that is used for word split
ting after expansion and to split lines into words with
the read builtin command. The default value is
``<space><tab><newline>''.
Il faudra remplacer ("programmer"!) source "$gloup" par:
while read line ; do
case "$line" in
NOM=.*) NOM="${line/NOM=}" ;;
COMMENTAIRE=.*) COMMENTAIRE="${line/COMMENTAIRE=}" ;;
*) echo "${gloup}: Ligne de configuration invalide:"
echo "$line"
exit 1 ;;
esac
done < "$gloup"
ah, bah alors, j'ai une autre question.
J'ai des options (pas forcement toute renseignees ou obligatoires), genre
PROG=prog
OPT1P
OPT2=tagada
OPT3 > OPT4=-s
et je souhaite avoir une ligne de commande
prog -n 50 -opt=tagada -s
Je fais une serie de (les ames sensibles peuvent fermer les yeux):
echo -n "$PROG " > go
if [ -n "$OPT1" ]; then echo -n " -n $OPT1 " >> go; fi
if [ -n "$OPT2" ]; then echo -n " -opt=$OPT2 " >> go; fi
if [ -n "$OPT3" ]; then echo -n " -p $OPT3 " >> go; fi
if [ -n "$OPT4" ]; then echo -n " $OPT4 " >> go; fi
echo "" >> go
GO=`cat go`
$GO &
A l'usage, ca fonctionne bien, mais ca me parait quand meme un peu
goret: passer par un fichier, puis la variable.
Une idee pour ameliorer le truc?
Oui. À quoi ça sert que Ducros se décarcasse? Tu n'apprends rien?
Relis mon message précédent que tu as si bien cité ci-dessus!
Et à l'usage ça merde quand une des options contient des blancs.
J'ai plusieurs fichiers de configuration contenant (entre autre) une variable $NOM et une autre $COMMENTAIRE.
Je souhaite mettre en place un script dialog --menu qui me permette de choisir un de ces fichiers.
Mais ca ne fonctionne absolument pas.
La variable $NOM ne fait qu'un caractere, mais $COMMENTAIRE en fait plusieurs. Si j'ai: NOM=test1 COMMENTAIREÎci est un commentaire
#!/bin/bash choices=() for gloup in *.cfg ; do source $gloup choices[${#choices[@]}]="$NOM" choices[${#choices[@]}]="$COMMENTAIRE" done dialog --backtitle "Back Title" --title "TITLE" --menu " test:" 18 60 6 "${choices[@]}" "Abandon" "Quitter le prog" 2> fich-temp
Mais ce script ne fonctionne pas comme attendu (?)
1.cfg NOM=un COMMENTAIRE=un commentaire
Et moi, je m'attendais à ce que tu mettes:
COMMENTAIRE="un commentaire"
Si tu insiste pour
COMMENTAIRE=un commentaire
alors il me semble que IFS ne servira à rien ici.
Pour les currieux: IFS ne sert qu'à couper les arguments d'une commandes, et dans: COMMENTAIRE=un commentaire avec plusieurs espace ^ ^ ^ ^ ^ | | | | | | | | | +-- IFS | | | | | | | +--- argument | | | | | +-- commande | | +--variable +-- valeur
Comme toujours: man bash
IFS The Internal Field Separator that is used for word split ting after expansion and to split lines into words with the read builtin command. The default value is ``<space><tab><newline>''.
Il faudra remplacer ("programmer"!) source "$gloup" par:
while read line ; do case "$line" in NOM=.*) NOM="${line/NOM=}" ;; COMMENTAIRE=.*) COMMENTAIRE="${line/COMMENTAIRE=}" ;; *) echo "${gloup}: Ligne de configuration invalide:" echo "$line" exit 1 ;; esac done < "$gloup"
ah, bah alors, j'ai une autre question.
J'ai des options (pas forcement toute renseignees ou obligatoires), genre PROG=prog OPT1P OPT2=tagada OPT3 > OPT4=-s
et je souhaite avoir une ligne de commande prog -n 50 -opt=tagada -s
Je fais une serie de (les ames sensibles peuvent fermer les yeux): echo -n "$PROG " > go if [ -n "$OPT1" ]; then echo -n " -n $OPT1 " >> go; fi if [ -n "$OPT2" ]; then echo -n " -opt=$OPT2 " >> go; fi if [ -n "$OPT3" ]; then echo -n " -p $OPT3 " >> go; fi if [ -n "$OPT4" ]; then echo -n " $OPT4 " >> go; fi echo "" >> go GO=`cat go` $GO &
A l'usage, ca fonctionne bien, mais ca me parait quand meme un peu goret: passer par un fichier, puis la variable. Une idee pour ameliorer le truc?
Oui. À quoi ça sert que Ducros se décarcasse? Tu n'apprends rien? Relis mon message précédent que tu as si bien cité ci-dessus!
Et à l'usage ça merde quand une des options contient des blancs.