[ Ksh ] Variable contenant des espaces

Icefan -  
Icefan Messages postés 6 Statut Membre -
Bonjour à tous et à toutes.

Je suis actuellement en train de programmer en Ksh un menu de choix pour un client.

Je variabilise les différents choix dans des variables que j'utilise ensuite dans un case mais j'ai un problème.

Mes choix se forment ainsi : chx1="Texte_du_premier_choix"

Pourquoi des underscores ? Car si je mets des simples espaces, la variable $chx1 n'est pas interprétée dans le case ce qui fausse tout mon menu, j'ai donc ajouté ces underscores et cela marche mais cela affiche la variable telle quelle donc avec les underscores et le client ne veut pas ça.

Je cherche donc une solution pour afficher dans le case ma variable avec des espaces.

Je vous donne un bout de code de mon menu pour être plus explicite.

#!/bin/ksh
 
chx1="Texte_du_choix1"
chx2="Texte_du_choix2"
chx3="Texte_du_choix3"
chx4="Texte_du_choix4"
chx5="Texte_du_choix5"
chx6="Quitter"

PS3="Veuillez entrer votre choix :"
	
select choixaction in "$chx1" "$chx2" "$chx3" "$chx4" "$chx5" "$chx6"
    do
       case $choixaction in
#Selection du choix 1
	 $chx1)
	 instructions
              break
	 ;;
#Selection du choix 2
	 $chx2)
	 instructions
	 break
	 ;;
#Selection du choix 3
	 $chx3)
              instructions
	 break
              ;;
#Selection du choix 4
	 $chx4)
	 instructions
              break
	 ;;
#Selection du choix 5
	 $chx5)
	 instructions
              break
	 ;;
#Selection du choix 6
	 $chx6)
#Arret du programme
	 echo "\nVous avez quitte le programme\n"
	 exit
	 ;;
#Controle d erreurs
	 *) echo "\nChoix inexistant. Veuillez recommencer\n"
	 ;;
       esac
  done


D'abord je déclare mes variables qui vont être utilisées dans le case afin de simplifier la modification de celles-ci en cas de changement d'avis. Ensuite j'ouvre un menu et j'appelle mes variables. Le menu fonctionne très bien si les variables chx* contiennet des "_" à la place des " " ce qui est vite très moche.

Pouvez-vous m'aider ?

Merci d'avance

Icefan

Désolé pour les ligness imbriquées et les paragraphes collés, j'ai du mal a éditer ^^'

2 réponses

zipe31 Messages postés 38797 Date d'inscription   Statut Contributeur Dernière intervention   6 435
 
Salut,

Chez moi avec un /bin/ksh93 les variables avec des blancs passent très bien ;-\

Sinon, tu peux essayer avec l'expansion des paramètres. En gras les modifs. J'ai testé et ça marche aussi :

#!/bin/ksh93

chx1="Texte_du_choix1"
chx2="Texte du choix2"
chx3="Texte du choix3"
chx4="Texte du choix4"
chx5="Texte du choix5"
chx6="Quitter"

PS3="Veuillez entrer votre choix :"
	
select choixaction in "${chx1//_/ }" "$chx2" "$chx3" "$chx4" "$chx5" "$chx6"
    do
       case $choixaction in
#Selection du choix 1
	 ${chx1//_/ })
	 echo $chx1
              break
	 ;;
#Selection du choix 2
	 $chx2)
	 echo $chx2
	 break
	 ;;
#Selection du choix 3
	 $chx3)
              echo $chx3
	 break
              ;;
#Selection du choix 4
	 $chx4)
	 echo $chx4
              break
	 ;;
#Selection du choix 5
	 $chx5)
	 echo $chx5
              break
	 ;;
#Selection du choix 6
	 $chx6)
#Arret du programme
	 echo "\nVous avez quitte le programme\n"
	 exit
	 ;;
#Controle d erreurs
	 *) echo "\nChoix inexistant. Veuillez recommencer\n"
	 ;;
       esac
  done
0
Icefan
 
Salut =)

Merci pour ta réponse.

Je me suis empressé de tester tout ça et malheureusement rien ne va :'(

Si j'ajoute 93 au #!/bin/ksh93, il me dit :
interpreter "/bin/ksh93" not found
file link ressolves to "/usr/bin/ksh93"
sh: vues2.sh (nom de mon script): not found

En gros, il ne trouve pas ksh93 et du coup ne trouve pas mon script. J'ai regardé dans l'arboressence via des ".." et il n y a pas de ksh93 dans /usr/bin, il y a bien ksh mais pas 93 :S

Ensuite avec ${chx1//_/ }, il ne m'affiche plus mon menu et me met :
"${chx1//_/ }": bad substitution

Je ne comprend pas pourquoi, ça va faire 2 semaines que j'essaye de régler ce problème d'affichage avec espaces et chaque réponse que l'on me donne me semble bonne mais ne fonctionne pas avec moi :( ça me prend la tête !

Je suis peut-être aussi un boulet qui ne fais pas bien les choses ^^

Éclairer moi s'il vous plait =)

Icefan
0
zipe31 Messages postés 38797 Date d'inscription   Statut Contributeur Dernière intervention   6 435
 
Si j'ai précisé ksh93 c'était juste pour clarifier en fonction de ma distribution (Mandriva).

Sur quel système es-tu ?
Est-ce que ksh est obligatoire ?

Que te renvoie les commandes suivantes dans un shell ksh chez toi :
$ ksh --version
  version         sh (AT&T Research) 93t 2008-06-24

$ chx1="Texte_du_choix1"

$ echo $chx1
Texte_du_choix1

$ echo ${chx1//_/ }
Texte du choix1

$ echo "${chx1//_/ }"
Texte du choix1

$
0
Icefan Messages postés 6 Statut Membre
 
Ah d'accord.

Je suis sur Windaube mais j'ai une console Unix via Putty.
Oui.

ksh --version : rien, à moins que je me sois trompé dans la syntaxe ou dans l'endroit de le tapper.

chx1="Texte_du_choix1"

echo $chx1 : Texte_du_choix1

echo ${chx1//_/ } : ${chx1//_/ }: bad substitution

echo "${chx1//_/ }": "${chx1//_/ }": bad substitution
0
zipe31 Messages postés 38797 Date d'inscription   Statut Contributeur Dernière intervention   6 435
 
Quel Unix ?

Que renvoie :
cat /etc/shells
echo $SHELL
ls -l /bin/ksh
0
Icefan Messages postés 6 Statut Membre
 
Alors là je ne sais pas ^^' Je ne m'y connais pas beaucoup.

cat /etc/shells : toute une liste de shell (/sbin//sh ; /users/bin/sh ; /users/bin/ksh...

echo $SHELL : /bin/sh

ls -l /bin/ksh : -r-xr-xr-x 2 bin bin 159744 Jul 14 2004 /bin/ksh
0
zipe31 Messages postés 38797 Date d'inscription   Statut Contributeur Dernière intervention   6 435
 
Ok ;-\

Donc je disais que chez moi, avec le texte des variables avec les espaces le menu était bien affiché. Par contre chez toi ce n'est pas le cas ?
Essaie de remettre des blancs dans tes variables et de mettre des guillemets autour de tes variables dans le "case" :

chx1="Texte du choix1"
chx2="Texte du choix2"
...
...
       case $choixaction in
#Selection du choix 1
	 "$chx1")
	 instructions
              break
	 ;;
#Selection du choix 2
	 "$chx2")
	 instructions
	 break
	 ;;
etc.
0