Confusion avec la commande printf?

13

Je dois imprimer les trois lignes suivantes dans une seule commande d'impression sans utiliser la commande echo. J'ai donc choisi la commande printf. Voici les trois lignes:

  Different characters can be represented and supported 
  in the print command, for example: 
  x-y, X+Y, –, +, <, >, %, $, #, &.

Ce que j'ai fait jusqu'à présent, c'est:

   printf "
   Different characters can be represented and supported 
   in the print command, for example: 
   x-y, X+Y, –, +, <, >, %, $, #, &.
   "

Mais j'ai eu une erreur bash pour la troisième ligne ','.

Est-ce que quelqu'un m'éclairera.

Narwen
la source
Soit dit en passant, il y a une différence entre la printcommande et la printfcommande.
Flimm

Réponses:

12

Mieux utiliser:

printf "Different characters can be represented and supported\n\
in the print command, for example:\n\
x-y, X+Y, –, +, <, >, %%, $, #, &.\n"

Vous obtenez cette erreur, comme d'autres l'ont dit ici, à cause du %caractère spécial qui doit être échappé.

Voir man 1 printfpour plus d'informations.

Radu Rădeanu
la source
@Narwen Je vous suggère d'utiliser tout le temps l'homme quand vous devez jouer avec des personnages spéciaux. Pour rechercher dans man, tapez /your_string_to_searchet appuyez sur entrée.
Radu Rădeanu
4
Tout l'intérêt de printfce %personnage est ce qu'il fait!
Kaz
14

%est un caractère spécial dans printf. C'est ce qui cause l'erreur. Vous devez y échapper au fur et à mesure %%.

$peut également être substitué à l'intérieur de guillemets doubles par le shell externe, vous devriez donc y échapper ( \$). Il est généralement plus simple d'utiliser des guillemets simples.

Oli
la source
5
Le signe dollar n'est spécial que lorsqu'il est suivi d'un nom de variable valide, ce qui n'est pas le cas ici.
glenn jackman
1
$variableest remplacé par le shell, pas par printf. Si vous entourez votre chaîne de guillemets simples au lieu de guillemets doubles, $elle ne sera pas interpolée par le shell et sera directement transmise à printf.
Flimm
@glennjackman En plus d'être spécial lorsqu'il est suivi d'un nom de variable valide (que cette variable soit réellement définie ou non), il $est également spécial lorsqu'il est suivi par{ ou par un symbole de paramètre spécial , ou un ou plusieurs chiffres . L'idée de base de ce que vous dites est cependant correcte.
Eliah Kagan
9

le %est spécial pour printf: c'est le premier caractère dans les spécificateurs de format. Si vous voulez un pourcentage littéral, utilisez%%

glenn jackman
la source
9

Il est un peu surprenant de voir que lorsque vous n'êtes pas autorisé à utiliser la echocommande, vous avez choisi d'utiliser la printfcommande à la place.

Pourquoi pas cat?

#!/bin/bash

cat<<'EOF'
Different characters can be represented and supported
in the print command, for example:
x-y, X+Y, –, +, <, >, %, $, #, &.
EOF
thom
la source
Mais j'ai dû remplacer echo par la commande print selon la question. Mais merci pour l'aide.
Narwen
2
Pour éviter d'interpréter des chaînes comme $foodans le texte, utilisez cat <<'EOF'plutôt que cat <<EOF.
Lekensteyn
4

printfest une impression formatée qui prend une chaîne de format comme premier paramètre. Les autres paramètres sont utilisés dans la chaîne de format. Les trois choses à retenir lors de l'utilisation printfsont:

  1. Bien que de nombreuses langues aient des printfinstructions / commandes / fonctions, elles diffèrent toutes un peu, vérifiez toujours les détails dans la documentation spécifique à la langue (C, bash, php, perl, etc.),

  2. Vous ne devez jamais utiliser les informations fournies par l'utilisateur dans la chaîne de format. C'est toujours une faille de sécurité. Si vous souhaitez afficher une chaîne fournie par l'utilisateur, utilisez une chaîne de format comme "%s".

  3. La barre oblique inverse ( \) et le signe de pourcentage ( %) sont tous deux des caractères d'échappement qui modifient la signification du ou des caractères suivants si vous souhaitez qu'un caractère d'échappement apparaisse dans votre sortie, il doit être échappé ou extrait d'un autre paramètre. Le signe dollar ( $) n'est pas spécial pour printf, mais est spécial pour le shell, alors faites attention à vos citations.

printfest idéal pour formater les nombres. consultez les pages de manuel pour plus de détails

hildred
la source
2

Comme d'autres l'ont mentionné, le %symbole est spécial pour printf.

Si vous souhaitez simplement imprimer une chaîne telle quelle, donnez printf %scomme premier argument et la chaîne entourée de guillemets simples comme deuxième argument:

printf %s '
Different characters can be represented and supported 
in the printf command, for example: 
x-y, X+Y, –, +, <, >, %, $, #, &.
'

L'utilisation de guillemets simples au lieu de guillemets doubles empêche le shell d'interpoler des symboles comme $.

Flimm
la source