0

考虑一个包含整数的 this 字符串

nanoseconds=$(date +%s%N)

当我想去掉最后六个字符时,什么在语义上会更好?

仅从字符串中剥离字符

nanoseconds=$(date +%s%N)

milliseconds=${nanoseconds%??????}

或将该值除以 1000000

milliseconds=$((nanoseconds / 1000000))

编辑

抱歉不清楚。它基本上是用于从纳秒到毫秒的转换。我想我回答了我自己的问题......

4

2 回答 2

2

两者都是等价的,但总的来说,我认为前一种方法更安全。第一种方法是显式的,并且正是您想要做的:从字符串的后面删除一个子字符串。

另一种是依赖于正确舍入的数学运算。虽然我无法想象它会在哪里失败,但我更喜欢第一种方法。

当然,除非你真正想要的不是去掉最后三个字符而是除以 1000 :-)

后记:哈哈,我当然知道它会在哪里失败。让值=“123”。${value%???}按预期去除最后三位数字,留下一个空字符串。$(( value / 1000 ))结果值等于"0"(长度为 1 的字符串)。

编辑:因为我们现在知道它不是关于剥离字符,而是四舍五入,显然除以 1000 是解决问题的正确方法:-)

于 2012-10-12T13:09:10.650 回答
1

当涉及字符串时,最清晰的方法可能是支持它的 shell 中的字符串订阅。

s=$(LC_TIME=C date +%s.%N) s=${s::-3}

幸运的是,GNU 日期至少默认为 %N 的零填充,因此除法应该是可靠的。(请注意,这两种方法都是截断,而不是四舍五入)。

(( s=(10#$(LC_TIME=C date +%s%N))/1000 ))

如果你想四舍五入,你可以做得比这些好一点printf

printf -v milliseconds %.6f "$(LC_TIME=C date +%s.%N)"

ksh93 的 printf 支持%N,所以不需要日期。转换可以是自动的。如果你有(现代的)ksh 可用,你绝对应该使用它。

typeset -T MsTime=(
    typeset -lF6 .=0

    function get {
        ((.sh.value=$(LC_TIME=C printf '%(%s.%N)T')))
    }
)

MsTime milliseconds
print -r "$milliseconds"
于 2012-10-12T16:57:04.280 回答