【问题标题】:Bash retain leading zero in front of Decimal Number FormatBash 在十进制数格式前保留前导零
【发布时间】:2021-06-20 06:13:56
【问题描述】:

我有一个脚本,它根据用户在 GMT 中给出的时间收集文件列表。例如,[从:0900 到:1200]。问题是首先我将用户输入的数字(八进制)转换为十进制。这样做后,前面的零会被截断。下面是我的代码。

from1="0900"
from=$((10#$from1)); #Converting from Octal to Decimal
to1="1200"
to=$((10#$to1)); #Converting from Octal to Decimal

来自:900的输出

这就是问题出现的地方,因为我需要在前面加上零才能输出fromto 之间的值

if [[ $from -le $val && $val -le $to ]]
then
     echo $val >> some_output.txt
fi

上面的 sn-p 不会被触发,因为 from 的值是 900 而不是 0900

我该如何解决这个问题?在 if 语句中进行比较时,有没有办法在前面添加前导零?

谢谢。

【问题讨论】:

  • from=$((10#$from1));,这不会从八进制转换任何内容,它只是强制将数字解释为十进制。此外,0900 甚至不是一个有效的八进制数。而且,您的用户以八进制输入数字?这听起来很古怪。你到底在做什么?
  • @ilkkachu 前面的前导零是使它被解释为八进制的原因。用户输入 fromto 值。为简单起见,我只是在上面的示例中分配了一些值。如上面的 if 语句所示,我希望它花费介于 fromto 之间的时间并将其附加到输出文件中。例如,如果文件包含[0850, 0910, 0950, 1020, 1040, 1100, 1300, 1500] ,则应将0910, 0950, 1020, 1040, 1100 添加到输出文件中。截至目前,我不能这样做,因为 from 的值没有被正确解释。
  • 将字符串转换为数字有什么原因吗?您不只是比较字符串的任何原因,例如[[ ! "${from1}" > "${val}" && ! "${val}" > "${to1}" ]];或者,保留您的字符串和数字,使用数字进行比较,然后使用字符串进行后续处理...?
  • @markp-fuso,我认为如果他们给900而不是0900,那将会中断。
  • @ilkkachu ... 当然,所以 OP 需要添加一些额外的代码以确保所有值都用0 左填充,以及额外检查数字是否代表实际时间(即, '978` 无效)

标签: bash decimal octal


【解决方案1】:

如果您想将数字视为十进制,无论前导零如何,您可以在 Bash 中添加 10# 前缀(如果您有负数,则需要在减号之后)。

打印出来

901 is between 0900 and 1200
1101 is between 0900 and 1200
#!/bin/bash
between() {
        local val=$1
        local from=$2
        local to=$3
        if [[ "10#$from" -le "10#$val" ]] && [[ "10#$val" -le "10#$to" ]]; then
                echo "$val is between $from and $to"
                return 0
        fi
        return 1
}

between  901 0900 1200
between  809 0900 1200
between 0809 0900 1200
between 1101 0900 1200
between 1300 0900 1200

或者,您可以删除前导零,或将数字填充到相等的长度并作为字符串进行比较。

【讨论】:

    猜你喜欢
    • 2015-03-09
    • 2013-05-31
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2020-06-11
    相关资源
    最近更新 更多