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