如何让 $(/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 是一个选项的主要内容,如果未能解决你的问题,请参考以下文章

无法让 ASP.NET MVC 6 控制器返回 JSON

如何让Ultraedit支持python语法高亮

如何在 OCaml 中交错 3 个列表

如何让自己的电脑有python环境?

如何让函数啥都不返回?

如何定义一个使用 Python 读取并返回列表中所有值的函数?