Shell-script reconnaissance de '

Fermé
jakol - 25 avril 2009 à 18:10
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 25 avril 2009 à 18:41
shell-script reconnaissance de '

Bonjour,
j'ai fait le shell script suivant:

#!/bin/sh
i=$1
shift
while [ $i -ne 0 ]
do
echo $* >toto
i=$[$i-1]

done
exit

lorsque je lance le programmeen mettant des arguments

$ ./repeat 2 je m\'\appelle jakol # j'ai mis deux \ entre la '
je m'appelle jakol
je m'appelle jakol

c'est bon

mais quand je lance:

./repeat 2 je m'appelle jakol # ' n'est reconnu comme faisant parti des caractères
>

Y aurait-il un moyen dans le script de le faire reconnaitre comme un élément de la phrase ?
merci d'avance pour vos réponses

:o)
A voir également:

2 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
25 avril 2009 à 18:36
Salut,

Non tu ne pourras pas dans la mesure où ce n'est pas le script qui pose problème mais le shell qui lance le script.

La quote simple (tout comme la double d'ailleurs) est un des caractères réservés du shell qu'il faut absolument échapper pour une interprétation littérale...

Tu peux toujours entourer l'expression par des quotes doubles, mais à ce moment là il n'y aura plus que 2 arguments dans ta ligne de commande !
./repeat 2 "je m'appelle jakol"

$1 = 2
$2 = "je m'appelle jakol"

;-))
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
25 avril 2009 à 18:41
Salut,

L'apostrophe simple est un caractère de protection pour le shell.
Voir le man bash
PROTECTION
       Les protections (quoting) permettent de forcer l'interpréteur à ignorer la signification spéciale de certains caractères ou mots. Les protections peuvent être utilisées pour désactiver le traitement des caractères spéciaux,
       éviter la reconnaissance des mots réservés ou empêcher le développement des paramètres.

       Tous les métacaractères décrits plus haut dans DÉFINITIONS ont des significations spéciales pour l'interpréteur et doivent être protégés pour ne représenter que leur propre caractère.

       Lorsque les outils de développement de l'historique des commandes sont utilisés (voir plus bas DÉVELOPPEMENT DE L'HISTORIQUE ), le caractère de développement de l'historique, généralement !, doit être protégé pour éviter le
       développement de l'historique.

       Il y a trois mécanismes de protection : le caractère d'échappement, les guillemets simples (« single quote ») et les guillemets doubles (« double quote »).

       Un  caractère  contre-oblique (\) non protégé, est le caractère d'échappement. Il préserve la valeur littérale du caractère qui le suit, à l'exception du <saut de ligne>. Si un couple \<saut de ligne> apparaît et si la con-
       tre-oblique n'est pas elle-même protégée, l'ensemble \<saut de ligne> est considéré comme une continuation de ligne (c'est-à-dire qu'il est supprimé du flot d'entrée et ignoré en pratique).

       Encadrer des caractères entre des guillemets simples préserve la valeur littérale de chacun des caractères entre guillemets simples. Un guillement simple ne peut pas être placé entre deux guillemets simples, même  s'il  est
       précédé d'une contre-oblique.

       Encadrer des caractères entre des guillemets doubles préserve la valeur littérale de chacun des caractères sauf $, `, \ et, lorsque le développement de l'historique est activé, !. Les caractères $ et ` conservent leurs sig-
       nifications spéciales entre guillemets doubles. La contre-oblique ne conserve sa signification spéciale que lorsqu'elle est suivie par l'un des caractères suivants : $, `, ", \ ou <saut de ligne>. Un guillemet  double  peut
       être protégé entre deux guillemets doubles en le faisant précéder d'une contre-oblique. S'il est activé, le développement de l'historique sera effectué, à moins qu'un !  apparaissant entre guillemets doubles ne soit protégé
       par une contre-oblique. La contre-oblique précédant le ! n'est pas supprimée.

       Les caractères spéciaux * et @ ont des significations spéciales lorsqu'ils se trouvent entre des guillemets doubles (voir PARAMÈTRES plus bas).

       Les mots de la forme $'chaîne' sont traités spécialement. Le mot est développé en chaîne avec les caractères protégés par contre-oblique remplacés comme spécifié par le standard ANSI C. Les  suites  d'échappement  par  con-
       tre-oblique, si présentes, sont décodées comme suit :
              \a     alerte (alarme)
              \b     effacement arrière (backspace)
              \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
              \'     guillemet simple
              \nnn   le caractère 8 bits dont la valeur octale est nnn (de un à trois chiffres)
              \xHH   le caractère 8 bits dont la valeur hexadécimale est HH (un à deux symboles hexadécimaux)
              \cx    un caractère contrôle-x

       Le résultat développé est protégé par des guillemets simples comme si le symbole dollar n'avait pas été présent.

       Une  chaîne  entre guillemets doubles précédée d'un symbole dollar ($) conduira à la traduction de la chaîne selon le paramètre linguistique régional en vigueur. Si le paramètre linguistique régional courant est C ou POSIX,
       le symbole dollar est ignoré. Si la chaîne est traduite et remplacée, le résultat est protégé par des guillemets doubles.
0