如何使$(/bin/printf -6)返回-6而不是认为-6是一个选项?

4

我有一个bash shell脚本,其中有一行代码:

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

${i}包含类似于-6的内容时,printf会认为它正在传递一个选项。由于无法识别该选项,因此会产生错误。

如果将${i}用引号括起来,printf仍然会认为它正在传递一个选项。

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

如果我转义引号,变量$g将会保存"-6",这也不是我想要的。

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

有没有办法在文本中避免破折号(-)的出现。

printf是一个BusyBox应用程序。

4个回答

13

大多数GNU程序支持使用--作为定界符,以告诉程序所有后续的参数都不是选项。例如:

$ printf -- -6
-6

谢谢。那样做是可行的,但我的 printf 是 BusyBox 版本,不支持该选项。还有其他想法吗? - Andrew
@Andrew 在这种情况下,像 ndim 建议的格式化字符串可能是最好的选择。我已经为您的问题添加了 busybox 标签,以便未来的读者可以清楚地看到这一点。 - Jack Lloyd
1
看起来足够新的busybox版本也支持“--”:busybox printf -- -6在busybox 1.27.2中输出“-6”。 - Jack Lloyd

7
如果您使用实际的格式字符串调用printf会怎样?
$ printf "%d\n" -6
-6
$ /sbin/busybox printf "%d\n" -6
-6
$

这似乎适用于GNU coreutils和busybox的printf。

这个可以工作 - 虽然我认为脚本不做这个的原因是有道理的。因为它只需要简单地使用echo命令。但是现在它能够工作,如果有更好的解决方案,我会很感兴趣。 - Andrew
如果只是一个%d的问题...那么你可以只做g=$i,而不需要调用另一个进程。 - ndim
${i} 可以是任何东西,数字、字符串等等。任何以 '-' 开头的值都会导致 printf 失败。 - Andrew
没错。所以我们现在解决了如何让printf(1)处理$i中的负数的问题。然而,你的脚本如何得出$i的值以及如何处理新的$g的问题则完全不同。 - ndim

0

你应该使用

printf -- -6

“应该”吗?如果-6是一个常量,并且在解释为格式字符串时可以被审计以正确地执行,那么可以。如果它来自变量,则应提供显式的格式字符串:printf '%s' -6,甚至是 printf -- '%s' -6 - Charles Duffy

0
如果您以这种方式提供非数字参数,则会收到错误消息:
$ busybox printf "%d" "a"
a: conversion error
-1

但是你可以使用%s,它适用于数字和非数字参数(只要你不需要进行任何格式化):

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

如果您没有使用printf的格式化功能,并且需要输出值而不换行,则busybox的echo命令支持-n

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接