[Shell] read et identifiant non valable

Bonjour,

Aujourd’hui c’est décider je me simplifie la vie, je fait des scripts shell qui vont travailler pour …

Pour la petite histoire, tous les matins en arrivant au boulot il fait que je fasse l’audit chiffre de la veille. Ca prend vite 2h, c’est répétitive et sans intérêt personnel… Etant de permanence au bureau aujourd’hui je me suis dit que ça serait bien d’automatiser tout ça.

Mon script tourne pas trop mal, suaf que au moment ou je veut mettre de la couleur pour que ce soit plus agreable au matin ba voila…

J’ai le droit a ce jolie message d’erreur.

Voici mon code:

BOLD est definie comme ceci BOLD="\033[1m" plutôt dans le script

Ça fait 2h que je travail dessus avec Google, mais la je commence a perdre espoir…

Merci de votre aide

Bonjour,

Essaye de modifier la ligne ainsi :

Pour voir si c’est à cause de la variable BOLD que ça ne marche pas. Remarque que j’ai mis des guillemets simples (’) au lieu des guillemets doubles (").

Quand je remplace par le morceau de code que tu ma donner ca donne ca:

J’ai essayez en re-remplacent les ’ ’ par " " => Idem

Moi je ferais comme ceci :

C’est ce que je vais finir par faire, mais est ce que tu a une idée de pourquoi il n’interprète pas le code couleur?

Dans le man de bash, ils expliquent le fonctionnement des deux commandes internes echo et read :

echo [-neE] [arguments ...] Affiche les arguments, séparés par des espaces, suivis par un saut de ligne. La valeur renvoyée est toujours 0. Si -n est indiqué, le saut de ligne final est supprimé. Si l'option -e est indiquée, l'interprétation des caractères suivants d'échappement par une contre-oblique est activée. L'option -E désactive l'interprétation de ces caractères d'échappement, même sur les systèmes où ils sont interprétés par défaut. L'option d'interpréteur xpg_echo peut être utilisée dynamiquement pour déterminer si echo développe ou non par défaut ces caractères d'échappement. echo n'interprète pas -- comme signifiant la fin des options. echo reconnaît les suites de caractères d'échappement suivantes : \a alerte (alarme) ; \b effacement arrière (« backspace ») ; \c supprime tout affichage suivant ; \e caractère d'échappement ; \f saut de page (« form feed ») ; \n saut de ligne (« new line ») ; \r retour chariot (« carriage return ») ; \t tabulation horizontale ; \v tabulation verticale ; \\ contre-oblique ; \0nnn le caractère 8 bits dont la valeur en octal est nnn (zéro à trois chiffres octaux) ; \xHH le caractère 8 bits dont la valeur hexadécimale est HH (un ou deux chiffres hexadécimaux) ;

[code]read [-ers] [-a tableau] [-d délimiteur] [-i texte] [-n nb_car] [-N nb_car] [-p invite] [-t délai] [-u fd] [nom …]

   Une ligne est lue depuis l'entrée standard ou à partir du descripteur de fichier fd fourni en argument à l'option  -u, puis le  premier  mot  de  cette  ligne  est affecté au premier nom, le second mot au second nom, et ainsi de suite avec les mots restants et leurs séparateurs affectés au dernier nom. S'il y a moins de mots lus dans le flux d'entrée  que  de variables, des valeurs vides sont affectées à celles restantes. Les caractères contenus dans la variable IFS sont utilisés pour découper la ligne en mots. Le caractère contre-oblique (\) permet de supprimer toute signification  spéciale  pour  le  caractère suivant et autorise la continuation de lignes. Les options, si fournies, ont les significations suivantes :

   -a tableau
          Les  mots  sont affectés aux indices successifs d'une variable tableau de nom tableau, en commençant à 0. tableau est détruit avant que de nouvelles valeurs ne soient affectées. Les autres arguments nom sont ignorés.

   -d délimiteur
          Le premier caractère de délimiteur est utilisé pour terminer la ligne de saisie, plutôt qu'un saut de ligne.

   -e     Si l'entrée standard provient d'un terminal, la bibliothèque readline (voir READLINE plus haut) est utilisée pour obtenir la ligne. Readline  utilise  les configurations d'édition en cours (ou par défaut, si l'édition de ligne n'était pas préalablement active).

   -i texte
          Si readline est utilisée pour lire la ligne, texte est placé dans le tampon d'édition avant le début de l'édition.

   -n nb_car
          read s'arrête après avoir lu nb_car caractères plutôt que d'attendre une ligne complète en entrée, mais un délimiteur est respecté si moins de nb_car caractères ont été lus avant le délimiteur.

   -N nb_car
          read s'arrête après avoir lu exactement nb_car caractères plutôt que d'attendre une ligne complète en entrée, sauf si une fin de fichier (EOF) est rencontrée ou si read dépasse son délai de réponse. Les délimiteurs rencontrés en entrée ne sont pas pris en compte et n'entraînent pas la fin de read avant que nb_car caractères n'aient été lus.

   -p invite
          Afficher invite sur la sortie d'erreur standard, sans caractère final de saut de ligne, avant d'essayer de lire toute nouvelle saisie. L'invite est affichée seulement si l'entrée vient d'un terminal.

   -r     La contre-oblique n'agit pas comme un caractère d'échappement. La contre-oblique est considérée comme faisant partie de la ligne. En particulier une contre-oblique suivie d'un saut de ligne n'est pas considérée comme une continuation de ligne.

   -s     Mode silencieux. Si une entrée arrive à partir d'un terminal, les caractères ne sont pas affichés.

   -t délai
          Conduire read à expirer et renvoyer un échec si une ligne complète en entrée n'a pas été lue dans le délai en  secondes. délai est un nombre décimal avec éventuellement des chiffres après la virgule (NdT : point en l'occurrence).
          Cette option n'est effective que si read lit l'entrée à partir d'un terminal, d'un tube, ou depuis un  autre  fichier spécial ; elle n'a aucun effet lors de la lecture d'un fichier normal. Si délai est nul, read termine avec succès si une entrée est disponible pour le descripteur de fichier indiqué, en échec sinon. L'état final est supérieur à 128 si le délai est dépassé.

   -u fd  Lire l'entrée à partir du descripteur de fichier fd.

   Si aucun nom n'est fourni, la ligne lue est affectée entièrement à la variable REPLY.  Le code renvoyé est zéro, sauf si une fin de fichier (EOF) est rencontrée, si read dépasse son délai de réponse (auquel cas le code renvoyé est plus grand que 128) ou si un descripteur de fichier incorrect est fourni en argument de -u.

[/code]

Donc, la commande echo interprête \033 comme le caractère de code ASCII 27 (en décimal). C’est grâce à l’option -e.

La commande read n’accepte pas ce genre d’échappement. Donc il faut que tu mettes le caractère de code ASCII 27 toi même dans la ligne de commande. Pour ça je te propose plusieurs possibilités :

escape="$(printf '\e')" read -p "Jour unique?(y/n) $escape[1m" TICKET_GENRE

escape="$(printf '\33')" read -p "Jour unique?(y/n) $escape[1m" TICKET_GENRE


esc="$(echo -e '\e')" read -p "Jour unique?(y/n) $esc[1m" TICKET_GENRE

esc="$(echo -e '\033')" read -p "Jour unique?(y/n) $esc[1m" TICKET_GENRE

Bonjour,

Désoler de ne pas avoir répondu plutôt, mais le 11/02 en partant du boulot j’ai percuté une remorque sur la voix rapide… Voiture épave et toute les galère qui vont avec… Bref me revoilà :slightly_smiling:

Merci pour les infos, je vais essayez de bidouiller avec tout ça :wink: