【问题标题】:printf command inside a script returns "invalid number"脚本中的 printf 命令返回“无效数字”
【发布时间】:2022-03-22 06:25:07
【问题描述】:

我无法让printf 在 bash 脚本中打印带有 %e 描述符的变量。它只会说

#!/bin/bash
a=14.9
printf %e 14.9;

我知道这可能是一个非常简单的问题,但我对 bash 还很陌生,总是使用 echo。另外,我在任何地方都找不到答案。


当我运行时我得到

$ ./test.text
./test.text: line 3: printf: 14.9: invalid number
0,000000

因此我的问题是语言环境变量 LC_NUMERIC:设置它以便我使用逗号作为小数分隔符。事实上,它已设置为欧洲本地化:

$ locale | grep NUM
LC_NUMERIC="it_IT.UTF-8"

我以为我将它设置为 en_US.UTF-8,但显然我没有。现在问题切换到如何设置我的语言环境变量。只需使用

$ LC_NUMERIC="en_US.UTF-8"

不会工作。

【问题讨论】:

  • 你得到了什么?在这里工作正常...
  • 虽然代码在这里运行良好(结果 1.490000e+01),但此页面 linuxconfig.org/bash-printf-syntax-basics-with-examples 表明 %e 可以/应该放在引号内。即 printf "%e" 14.9;
  • @enhzflep:谢谢,但问题不在于。您不需要将 printf 的参数放在双引号中,除非参数本身不需要它。此外,无论如何它都可以在没有它们的情况下工作。我可以使用 $export LC_NUMERIC="en_US.UTF-8" 设置变量,但这是非永久性的。我怎样才能使它永久化?我运行 Cygwin。
  • 尝试设置LC_NUMERIC="C"
  • @Axel:但他想要en_US.UTF-8

标签: bash printf


【解决方案1】:

这个:

LC_NUMERIC="en_US.UTF-8" printf %e 14.9

仅在该命令执行期间设置$LC_NUMERIC

这个:

export LC_NUMERIC="en_US.UTF-8"

仅在当前 shell 进程期间设置 $LC_NUMERIC

如果你添加

export LC_NUMERIC="en_US.UTF-8"

到您的$HOME/.bashrc$HOME/.bash_profile,它将为您启动的所有bash shell 设置$LC_NUMERIC

在您的.bashrc 或其他shell 启动文件中查找设置$LC_NUMERIC 的现有代码。

更新:

如果未设置$LC_NUMERIC 环境变量,则可以从$LANG$LC_ALL 设置LC_NUMERIC 区域设置。检查您的环境变量设置以及locale 命令的输出。 $LC_ALL 覆盖 $LC_NUMERIC$LC_NUMERIC 覆盖 $LANGman locale 和/或 man 7 locale 了解详情。

【讨论】:

    【解决方案2】:

    您可能遇到了语言环境问题,并且预计不会出现一段时间。试试:

    LC_NUMERIC="en_US.UTF-8" printf %e 14.9
    

    【讨论】:

      【解决方案3】:

      我遇到了这个错误并找到了这个页面。就我而言,这是 100% 的飞行员错误。

      month=2
      printf "%02d" month
      

      应该是

      printf "%02d" "${month}"
      

      或者更简单

      printf "%02d" $month
      

      【讨论】:

        猜你喜欢
        • 2013-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-07
        相关资源
        最近更新 更多