如何从“日期”的输出中删除前导零或避免此类十进制数字的八进制解释?

如何从“日期”的输出中删除前导零或避免此类十进制数字的八进制解释?

我有这个:

date +"%H hours and %M minutes"

我用节日来表达它..但它说的是:“零九小时”..我希望它说“九小时”!

但日期总是给我 09...所以我想知道 bash 是否可以轻松地使它变成 9?

在我尝试过的复杂脚本中

printf %d 09

但它失败了..不是八进制:(

任何想法?

答案1

  • 在您的情况下,您可以简单地通过在日期格式字符串-之后附加来禁用零填充:%%-H

    默认情况下,日期用零填充数字字段。 '%' 后面可以有以下可选标志:

    • -(连字符)不要填充该字段
    • _(下划线)用空格填充
    • 0(零)用零填充
    • ^如果可能的话使用大写
    • #如果可能的话使用相反的情况

    日期手册

  • 如果你想在 bash 中解释不同基数的数字

    • 以 0 开头的常量被解释为八进制数。
    • 前导 0x 或 0X 表示十六进制。
    • 否则,数字采用 [base#]n 形式,其中 base 是 2 到 64 之间的十进制数,表示算术基数,n 是该基数中的数字

    因此,要将数字解释为十进制,请使用10#n形式,例如。10#09

    echo $((10#09*2))
    18
    

    算术评估bash 手册的一部分。

答案2

如果您尝试以十进制形式与日期值进行比较,我发现此方法非常有效:

let mymin=$(date '+1%M') ; let mymin=$mymin%100

这总是产生一个十进制值。所以我可以这样做:

if [[ $mymin -le 1 ]]; then   # only 0 and 1 are true.

这样08、09就没有问题了。使用 %10 而不是 %100 给出从 0 到 9 的十分钟范围。我还发现以下给出了十进制值,没有前导零:

echo "$((10#$(date +%M)))"

答案3

0可移植的是,您可以轻松地从变量中删除前导。如果没有前导 ,这将使变量保持不变0

eval $(date +"h=%H m=%M")
h=${h#0}
m=${m#0}
say "$h hours and $m minutes"

在 bash、ksh 或 zsh 中,您可以使用 ksh 的附加 glob 模式来删除任意数量的前导0s。在 bash 中,shopt -s extglob首先运行。在 zsh 中,setopt kshglob首先运行。

eval $(date +"h=%H m=%M")
h=${h#+(0)}
m=${m#+(0)}
say "$h hours and $m minutes"

答案4

一般来说,在 bash 中:

test ${#number} -eq 2 && number=${number#0}

导致

date +"%H %M" | 
{ read hours minutes
hours=${hours#0}
minutes=${minutes#0}
echo "${hours} hours and ${minutes} minutes"; }

或者,不同的:

date +"%H hours and %M minutes" | sed -n -e 's/0\([0-9]\)/\1/g' -e p

我很惊讶日期没有适当的格式选项。

相关内容