0

整数を含むこの文字列を考えてみましょう

nanoseconds=$(date +%s%N)

最後の6文字を削除したい場合、意味的に何が良いでしょうか?

文字列から文字だけを取り除く

nanoseconds=$(date +%s%N)

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

または値を1000000で除算します

milliseconds=$((nanoseconds / 1000000))

編集

はっきりしないことをお詫びします。これは基本的に、ナノ秒からミリ秒への変換を行うためのものです。私は自分の質問に答えたと思います...

4

2 に答える 2

2

どちらも同等ですが、一般的には前者の方法の方が安全だと思います。最初の方法は明示的で、やりたいことを正確に実行します。つまり、文字列の後ろから部分文字列を削除します。

もう 1 つは、正しい丸めに依存する数学演算です。どこで失敗するか想像できませんが、最初の方法をお勧めします。

もちろん、最後の 3 文字を削除するのではなく、1000 で割ることが本当に必要な場合を除きます :-)

追記: もちろん、どこで失敗するかはわかっています。value="123" とします。${value%???}意図したとおりに最後の 3 桁を取り除き、空の文字列を残します。結果は(長さ 1 の文字列)$(( value / 1000 ))と等しい値になります。"0"

編集:文字を削除するのではなく丸めることであることがわかったので、明らかに1000で割ることが問題にアプローチする正しい方法です:-)

于 2012-10-12T13:09:10.650 に答える
1

文字列が含まれる場合の最も明確な方法は、おそらくそれをサポートするシェルでの文字列サブスクリプションです。

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 に答える