144

コマンドの実行にかかった時間を計算するスクリプトを bash で作成しています。次の点を考慮してください。

STARTTIME=$(date +%s)
#command block that takes time to complete...
#........
ENDTIME=$(date +%s)
echo "It takes $($ENDTIME - $STARTTIME) seconds to complete this task..."

私のロジックは正しいと思いますが、最終的には次の出力になります。

「このタスクを完了するのに数秒かかります...」

文字列の評価に何か問題がありますか?

bash 変数は型指定されていないと思いますが、それでも bash に「文字列から整数へ」のメソッドがあればいいのにと思います。

4

10 に答える 10

89

$(())またはは、算術$[]演算の結果を計算するために機能します。whichを使用し$()ているのは、単純に文字列を取得してコマンドとして評価することです。ちょっと微妙な違いです。お役に立てれば。

この回答のコメントでティンクが指摘したように、$[]非推奨であり、$(())優先する必要があります。

于 2013-06-04T01:03:16.813 に答える
57

の番号をENDTIMEコマンドとして実行しようとしています。のようなエラーも表示されるはずです1370306857: command not found。代わりに算術展開を使用します。

echo "It takes $(($ENDTIME - $STARTTIME)) seconds to complete this task..."

コマンドを別のスクリプトに保存して、commands.shtime コマンドを使用することもできます。

time commands.sh
于 2013-06-04T00:48:41.177 に答える
34

ここでBash のtimeキーワードを適切なフォーマット文字列とともに使用できます

TIMEFORMAT='It takes %R seconds to complete this task...'
time {
    #command block that takes time to complete...
    #........
 }

リファレンスTIMEFORMATの内容は次のとおりです。

このパラメーターの値は、time 予約語で始まるパイプラインのタイミング情報の表示方法を指定するフォーマット文字列として使用されます。「<code>%」文字は、時間値またはその他の情報に展開されるエスケープ シーケンスを導入します。エスケープ シーケンスとその意味は次のとおりです。中括弧はオプションの部分を示します。

%%

    A literal ‘%’.
%[p][l]R

    The elapsed time in seconds.
%[p][l]U

    The number of CPU seconds spent in user mode.
%[p][l]S

    The number of CPU seconds spent in system mode.
%P

    The CPU percentage, computed as (%U + %S) / %R. 

オプションのpは、小数点以下の桁数である精度を指定する数字です。値が 0 の場合、小数点または小数は出力されません。小数点以下 3 桁まで指定できます。3 より大きいpの値は 3 に変更されます。pが指定されていない場合は、値 3 が使用されます。

オプションは、分を含むMMmSS.FFsl形式の長い形式を指定します。pの値によって、分数が含まれるかどうかが決まります。

この変数が設定されていない場合、Bash は値があるかのように動作します。

$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'

値が null の場合、タイミング情報は表示されません。書式文字列が表示されると、末尾に改行が追加されます。

于 2015-03-14T06:48:21.053 に答える
2

経過秒オプションで time を使用してみてください。

/usr/bin/time -f%e sleep 1バッシュの下。

または\time -f%e sleep 1インタラクティブなbashで。

time の man ページを参照してください。

bash シェルのユーザーは、シェルの組み込みバリアントではなく、外部の time コマンドを実行するために、明示的なパスを使用する必要があります。時間が /usr/bin にインストールされているシステムでは、最初の例は /usr/bin/time wc /etc/hosts になります。

FORMATTING THE OUTPUT
...
    %      A literal '%'.
    e      Elapsed  real  (wall  clock) time used by the process, in
                 seconds.
于 2013-06-04T01:59:50.593 に答える
-3
start=$(date +%Y%m%d%H%M%S);
for x in {1..5};
do echo $x;
sleep 1; done;
end=$(date +%Y%m%d%H%M%S);
elapsed=$(($end-$start));
ftime=$(for((i=1;i<=$((${#end}-${#elapsed}));i++));
        do echo -n "-";
        done;
        echo ${elapsed});
echo -e "Start  : ${start}\nStop   : ${end}\nElapsed: ${ftime}"

Start  : 20171108005304
Stop   : 20171108005310
Elapsed: -------------6
于 2017-11-08T00:00:51.413 に答える