2009-10-23 21 views
4

J'ai un script shell bash qui a la ligne:

g=$(/bin/printf ${i}) 

quand ${i} contient quelque chose comme -6, printf pense qu'il est passé une option. Il ne reconnaît pas l'option, ce qui produit une erreur.

si le retour à la ligne ${i} entre guillemets, printf pense toujours qu'il est passé une option.

g=$(/bin/printf "${i}") 

si j'échapper les guillemets, la variable $g détient alors « -6 » qui est pas ce que je veux soit.

g=$(/bin/printf \"${i}\") 

Est-il absent pour échapper le tiret (-).

printf est une application BusyBox

Répondre

7

si vous appelé printf avec une chaîne de format réel?

$ printf "%d\n" -6 
-6 
$ /sbin/busybox printf "%d\n" -6 
-6 
$ 

Ceci fonctionne avec GNU coreutils 'et busybox' printf, apparemment.

+0

cela fonctionne - bien que je pense qu'il y a une raison pour laquelle le script ne fait pas cela déjà. Comme il pourrait simplement utiliser l'écho. Cependant, cela fonctionne pour l'instant, mais si quelqu'un comme une meilleure solution, je serais intéressé. – Andrew

+0

Eh bien, si c'est juste une question de% d ... alors vous pourriez juste faire 'g = $ i' et être fait sans invoquer un autre processus du tout. – ndim

+0

$ {i} peut être n'importe quoi, nombre, chaîne, etc. Toute valeur commençant par '-' entraînera l'échec de printf. – Andrew

12

La plupart des programmes GNU en charge l'utilisation -- comme séparateur pour indiquer au programme que tous les autres arguments ne sont pas des options. Par exemple

$ printf -- -6 
-6 
+0

merci. Cela fonctionnerait, mais mon printf est une version de BusyBox, qui ne supporte pas cette option. d'autres idées. – Andrew

+0

@Andrew Dans ce cas, une chaîne de format suggérée par ndim est probablement le chemin à parcourir. J'ai ajouté la balise busybox à votre question, ce qui est évident pour les futurs lecteurs. –

+0

Il semble que les versions suffisamment nouvelles de busybox supportent aussi '--':' busybox printf - -6' sorties '-6' avec busybox 1.27.2 –

1

Vous devez utiliser

printf -- -6 
0

Si vous nourrissez un argument non numérique de cette façon, vous obtenez un message d'erreur:

$ busybox printf "%d" "a" 
a: conversion error 
-1 

Mais vous pouvez utiliser %s et cela fonctionnera pour les deux arguments numériques et non numériques (aussi longtemps que vous n'avez pas besoin de faire une mise en forme):

$ busybox printf "%s" "a" 
a 
$ busybox printf "%s" -6 
-6 

Si vous n'êtes pas en utilisant les fonctions de formatage de printf et vous devez sortir la valeur sans une commande de saut de ligne, echo de busybox soutient -n:

$ busybox echo -n "a" 
a 
$ busybox echo -n -6 
-6