【问题标题】:How do I get $(/bin/printf -6) to return -6 and not think -6 is an option如何让 $(/bin/printf -6) 返回 -6 而不是认为 -6 是一个选项
【发布时间】: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 应用程序

【问题讨论】:

    标签: bash shell 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
    

    【讨论】:

      猜你喜欢
      • 2012-03-14
      • 1970-01-01
      • 2012-11-19
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 2019-03-02
      相关资源
      最近更新 更多