2016-11-04 1 views
1

Pour rendre mon code portable, j'essaie d'utiliser printf plutôt que echo. Mais alorsbash printf littéral verbatim chaîne

printf "-dogs-cats" 

renvoie une erreur. Une solution dans le cas présent est:

printf "-";printf "dogs-cats" 

Mais est-il une commande portable général, (ou une option avec printf) qui imprimera une chaîne arbitraire comme un littéral/mot pour mot, essayez de ne pas interpréter la chaîne comme format?

Je travaille sous BSD UNIX (sur un Mac) mais mon objectif est le code qui fonctionnerait aussi avec d'autres saveurs UNIX.

Répondre

6

Il suffit d'utiliser -- après printf pour le faire savoir qu'il n'y a pas d'autres arguments sont à venir et d'envisager la chaîne comme ceci:

$ printf -- "-dogs-cats" 
-dogs-cats     # no new line after this 

Ceci est un * NIX-trick qui peut être utilisé pour de nombreuses autres commandes . Comme Bash Reference Manual → 4 Shell Builtin Commands dit:

Sauf indication contraire, chaque commande builtin documentées en option acceptant précédés « - » accepte « - » pour signifier la fin des options. Les:, true, false et test builtins n'acceptent pas les options et ne traitent pas '-' spécialement. Les entités exit, logout, return, break, continue, let, et shift intègrent et traitent les arguments commençant par '-' sans nécessiter '-'. Les autres builtins qui acceptent les arguments mais ne sont pas spécifiés comme acceptant les options interprètent les arguments commençant par '-' comme des options invalides et nécessitent '-' pour empêcher cette interprétation.


Remarque pourquoi cela se produit:

$ printf "-dogs-cats" 
bash: printf: -d: invalid option 
printf: usage: printf [-v var] format [arguments] 

Cela fait printf comprendre la première partie de la chaîne, -d, comme argument.

+1

était sur le point de poster ceci comme réponse: D probablement aussi le point que printf ne pas ajouter de nouvelle ligne par défaut – Sundeep

+2

Sinon, utilisez une spécification de format: 'printf « % s "" -dogs-cats "' –

3

Utilisez une spécification de format:

printf '%s' "-dogs-cats" 
+0

J'aime mieux cette réponse car elle s'applique à des séquences de contrôle folles que l'on pourrait vouloir utiliser sans que le shell ne les interprète. – Demitri