如何让 $(/bin/printf -6) 返回 -6 而不是认为 -6 是一个选项
Posted
技术标签:
【中文标题】如何让 $(/bin/printf -6) 返回 -6 而不是认为 -6 是一个选项【英文标题】:How do I get $(/bin/printf -6) to return -6 and not think -6 is an option 【发布时间】:2010-12-09 11:59:11 【问题描述】:我有一个 bash shell 脚本,其中包含以下代码:
g=$(/bin/printf $i)
当$i
包含类似-6
的内容时,printf
认为它被传递了一个选项。它无法识别该选项,因此会产生错误。
如果将$i
用引号括起来,printf
仍然认为它被传递了一个选项。
g=$(/bin/printf "$i")
如果我转义引号,变量 $g
则保存“-6
”,这也不是我想要的。
g=$(/bin/printf \"$i\")
是否可以避开破折号 (-)。
printf 是一个 BusyBox 应用程序
【问题讨论】:
【参考方案1】:大多数 GNU 程序都支持使用 --
作为分隔符来告诉程序所有进一步的参数都不是选项。比如
$ printf -- -6
-6
【讨论】:
谢谢。这会起作用,但我的 printf 是 BusyBox 版本,它不支持该选项。任何其他想法。 @Andrew 在这种情况下,ndim 建议的格式字符串可能是要走的路。我已在您的问题中添加了 busybox 标签,因此这对未来的读者来说是显而易见的。 看起来足够新的busybox版本也支持--
:busybox printf -- -6
输出-6
和busybox 1.27.2【参考方案2】:
如果您使用实际的格式字符串调用printf
会怎样?
$ printf "%d\n" -6
-6
$ /sbin/busybox printf "%d\n" -6
-6
$
这显然适用于 GNU coreutils' 和 busybox' printf。
【讨论】:
这行得通——尽管我认为脚本没有这样做是有原因的。因为它可以简单地使用回声。但是它现在有效,但如果有人作为更好的解决方案,我会感兴趣。 好吧,如果这只是 %d... 的问题,那么您可以直接执行g=$i
并在不调用其他进程的情况下完成。
$i 可以是任何东西,数字,字符串等。任何以 '-' 开头的值都会导致 printf 失败。
没错。所以我们现在解决了如何让 printf(1) 处理$i
中的负数的问题。但是,您的脚本如何达到$i
的值以及如何处理新的$g
的问题是完全不同的问题。【参考方案3】:
你应该使用
printf -- -6
【讨论】:
“应该”?如果-6
是一个常量,并且可以在解释为格式字符串时进行审核以使其行为正确,那么当然可以。如果它来自变量,则应提供显式格式字符串:printf '%s' -6
,甚至是printf -- '%s' -6
。【参考方案4】:
如果您以这种方式输入非数字参数,则会收到错误消息:
$ 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
【讨论】:
以上是关于如何让 $(/bin/printf -6) 返回 -6 而不是认为 -6 是一个选项的主要内容,如果未能解决你的问题,请参考以下文章