OVH Cloud OVH Cloud

Script bash et dialog

3 réponses
Avatar
Kevin Denis
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=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.)

Comment resoudre le probleme?

Merci
--
Kevin

3 réponses

Avatar
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

Avatar
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


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


(ou mieux, programmer ses scripts en lisp!)

On va deja commencer par bash.



Lisp, c'est plus facile.


--
__Pascal Bourguignon__ http://www.informatimago.com/
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d? s++:++ a+ C+++ UL++++ P--- L+++ E+++ W++ N+++ o-- K- w---
O- M++ V PS PE++ Y++ PGP t+ 5+ X++ R !tv b+++ DI++++ D++
G e+++ h+ r-- z?
------END GEEK CODE BLOCK------