2009-10-23 43 views
4

我有一个具有行一个bash shell脚本:

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

${i}包含的东西像-6,printf认为它通过了一个选项。它无法识别该选项,因此会产生错误。

如果将${i}用引号引起来,printf仍然认为它通过了一个选项。

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

如果我逃跑的报价,可变$g然后持有“-6”,这是不是我想要的任何。

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

是否有逃跑的破折号( - )。

的printf是BusyBox的应用程序使用--作为分隔符告诉程序,所有其它参数不是选项

回答

7

如果你什么叫printf与实际的格式字符串?

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

这对GNU coreutils'和busybox'printf都有效,显然。

+0

这个工程 - 虽然我认为这是脚本不做的原因这已经。因为它可以简单地使用回声。然而,它现在可行,但如果任何人作为更好的解决方案,我会感兴趣。 – Andrew 2009-10-23 15:19:15

+0

那么,如果它只是%d的问题......那么你可以只做'g = $ i'并且完成而不需要调用另一个进程。 – ndim 2009-10-23 15:23:23

+0

$ {i}可以是任何东西,数字,字符串等。任何以' - '开头的值都会导致printf失败。 – Andrew 2009-10-23 15:32:10

12

大多数GNU程序支持。例如

$ printf -- -6 
-6 
+0

谢谢。这将工作,但我的printf是一个BusyBox版本,不支持该选项。任何其他想法。 – Andrew 2009-10-23 15:03:32

+0

@Andrew在这种情况下,ndim建议的格式字符串可能是要走的路。我已将busybox标签添加到您的问题中,这对于未来的读者来说显而易见。 – 2009-10-23 15:13:08

+0

它看起来像busybox的足够新版本也支持' - ':'busybox printf - -6'输出'-6'与busybox 1.27.2 – 2017-12-13 17:06:35

1

您应该使用

printf -- -6 
0

如果你给在这样一个非数字的参数,你会得到一个错误信息:

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

但是你可以使用%s,它将用于数字和非数字的参数工作(只要你不需要做任何格式):如果你不使用的printf的格式化功能

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

,你需要输出的值不换行,busybox的的echo命令支持-n

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