[linux-l] Bash-Frage

Lutz Meinert lutz.meinert at madvedge.de
Sa Okt 12 18:58:47 CEST 2002


Am Sam, 2002-10-12 um 16.38 schrieb Steffen Dettmer:
> * Lutz Meinert wrote on Sat, Oct 12, 2002 at 09:19 +0200:
> > Cleverer ist es, die Bildschirmmeldungen für die jeweilige Sprache als
> > einzelne Text-Files in seperaten Verzeichnissen zu halten. Der Pfad zum
> > jeweiligen "Sprach-Verzeichnis" erfolgt über eine Variable, die wiederum
> > über das Auslesen von $LANG definiert wird.
> 
> Also sowas wie
> 
> source lang/default/messages
> test -r lang/$LANG/messages && source lang/$LANG/messages
> 
> ja?

na ja, so ähnlich... ich hab's mit einem simplen case gebastelt, wobei
die entsprechenden Verzeichnisse mit Message-Texten De, En heissen (sind
bislang nur zwei).

case $LANG in
     de_*) gvMsgDir=De ;;
     en_* | us_*) gvMsgDir=En  ;;
     *) clear
	echo "\
Sorry, a translation does not as yet exists for your language. Now, here
comes
the english version.
             "
        gvMsgDir=En
        ;;
esac

> 
> > Dazu muss ich aber den Bash-Scripten eben diese erwähnten Text-Files
> > übergeben.
> > Darin stehen aber auch einige Variablen,
> 
> Da steht dann drin:
> HELLOMESSAGE="Hallo, das ist eine Testmeldung in Deutsch"
> OTHERMESSAGE="Noch ein Text"
> 
> usw oder wie?

Nö, nicht der ganze Text steht in Variablen. Nur die während des
Programmverlaufs dynamisch erzeugten Information wie:
"Sie haben \"$gvPartition\" gewählt. Wenn Sie fortfahren wird alles "

Den Wert für gvPartition habe ich zuvor über eine select-Abfrage bzw nun
über dialog-Menü-Box erhalten
> 
> > z.B. für die Wahl der Partition, des Mount-Verzeichnisses oder
> > Mount-Aliases. Diese kann ich nicht vorher wissen
> 
> Wie jetzt? Du meinst:
> 
> PART_YESNO="Wollen Sie wirklich die Partition /dev/hda verwenden?"
> 
> mit dynamischem /dev/hda? Dann entweder printf:
> 
> PART_YESNO="Wollen Sie wirklich die Partition %s verwenden?"
> 
> und im bash script dann 
> printf "$PART_YESNO", "$selected_partition";
> 
> oder auch
> PART_YESNO='Wollen Sie wirklich $selected_partition verwenden?'
> und
> echo `eval echo $PART_YESNO`
 
Die eval-Lösung hatte mir kurz zuvor schon freundlicherweise Martin
Finkbeiner zukommen lassen. Finde ich klasse, da ich im Großen und
GAnzen meinen kompletten bisherigen Code behalten kann. 
 

> Würde aber die Printf-Version vorziehen.
> 
> > # Beispiel 1 (alt, redundant, dumm):
> > # dialog --clear --title "CORP" --msgbox \
> > "Sie sind als \"$LOGNAME\" angemedelt" 25 80
> > 
> > # Beispiel 2 (neu, nicht redundant, eigentlich clever, aber Variablen 
> > # vom Text-File werden nicht aufgelöst
> > dialog --clear --title "CORP" --msgbox "$(cat $gvMsgDir/login)" 25 80
> 
> Du kannst machen:
> A=`eval echo cat $gvMsgDir/login`;
> dialog  --msgbox "$A";
> (bißchen lesbarer als alles inline).

Gute Idee. Ich verwende allerdings lieber eine Funktion, die ich auf
beliebige Textmeldungen anwenden kann:

function GF_MsgBox
{
  dialog --title "CORP" --msgbox \
  "$(eval echo \"$(cat $gvMsgDir/$1)\")" 25 80
}

# check root permissions
if [ $UID = 0 ]
    then GF_MsgBox welcome   
    else GF_MsgBox nonRoot
	 exit 0
fi


> Oder mit Freund printf:
> A=`printf "$LOGGED_AS_MSG", "$LOGNAME"`
> 
> mit
> LOGGED_AS_MSG="Sie sind als %s angemedelt";
> 
> Finde ich einfach besser lesbar und verständlicher. $LOGNAME ist
> natürlich ein blödes Beispiel, weil der ändert sich ja nicht,
> damit reicht hier ja ein 
> LOGGED_AS_MSG="Sie sind als $LOGNAME angemedelt";
> ganz ohne Printf (weil $LOGNAME ist ja beim Start so korrekt
> gesetzt).
> 
> Das printf in backticks ist natürlich lahm (wie dialog auch),
> weil man sinnlos oft forken muß. Da kann man auch in Erwägung
> ziehen:
> 
> LOGGED_AS_MSG='Sie sind als _LOGNAME_ angemedelt';
> dialog  --msgbox "${LOGGED_AS_MSG//_LOGNAME_/$LOGNAME}"
> 
> Nicht mehr lesbar, aber schnell (hier wird _LOGNAME_ als token
> subsituiert). Jedenfalls hilfreich, wenn man sehr viele evals
> oder $(cat) oder solche Bremsen hat. Bei 10 lohnt sich das nicht,
> klar, kann man gut printf nehmen, aber bei 100 wohl kaum noch.
>  
> > Vielleicht hat da ja eine(r) einen guten Tip...
> 
> Reicht erstmal ;) ?

Oh ja, das war reichlich. printf kannte ich noch nicht, riecht auch 
sehr nach C. Auch die LOGNAME-Substitution ist sehr clever. Vielleicht
mache ich später mal eine richtige GUI-Version. Dann werde ich mich wohl
auch mal mit C++ beschäftigen. 
> 
> oki,
> Steffen

Vielen Dank, Lutz





Mehr Informationen über die Mailingliste linux-l