簡體   English   中英

日期命令作為 bash 腳本中的變量。 需要每次調用而不是在變量聲明期間調用

[英]Date command as a variable in a bash script. Needs to be invoked each time instead of during variable declaration

我有一個 bash 腳本,在某些時候我使用 echo 將一些消息放入日志文件中。 我遇到的問題與 DATE 變量有關,該變量在整個腳本執行過程中為 static。

我在下面有這個基本腳本來說明問題:

#!/bin/bash

DATE=`date +"%Y-%m-%dT%H:%M:%S%:z"`

echo "script started at $DATE"

echo "doing something"
sleep 2

echo "script finished at $DATE"

如果我執行此腳本,兩行中 $DATE 變量的 output 是相同的。 是否有一些 bash 魔術可以很好地解決這個問題,而不必在每一行上用命令本身替換 $DATE?

提前致謝

使用 bash 版本 4.3+,您可以使用內置的printf來格式化日期時間。 下面的-1是一個神奇的值,意思是“現在”。

#!/bin/bash

datefmt='%Y-%m-%dT%H:%M:%S%z'

printf "script started at %($datefmt)T\n" -1

echo "doing something"
sleep 2

printf "script finished at %($datefmt)T\n" -1

bash 沒有為我識別%:z

較新版本的bash/printf內置支持生成日期時間戳,而無需生成子進程來調用date

$ builtin printf --help
...snip...
Options:
      -v var    assign the output to shell variable VAR rather than
                display it on the standard output
...snip...
    In addition to the standard format specifications described in printf(1),
    printf interprets:

      %b        expand backslash escape sequences in the corresponding argument
      %q        quote the argument in a way that can be reused as shell input
      %(fmt)T   output the date-time string resulting from using FMT as a format
                string for strftime(3)
... snip ...

而不是產生一個子進程來調用date ,例如:

logdt=`date +"%Y-%m-%dT%H:%M:%S:%z"`

同樣可以通過printf -v通過將所需格式包裝在%(...)T中來完成,例如:

printf -v logdt '%(%Y-%m-%dT%H:%M:%S:%z)T'

注意:假設%:z應該是:%z

假設您將用日期時間戳標記很多行,那么消除子過程date調用所節省的費用可能是巨大的。

運行 1000 代日期時間戳的測試:

$ time for ((i=1;i<=1000;i++)); do { printf -v logdt '%(...)T' | logdate=$(date ...) }; done

printf -v logdt '%(...)T'計時:

real    0m0.182s              # ~130 times faster than $(date ...)
user    0m0.171s
sys     0m0.000s

logdt=$(date...)的時間:

real    0m24.443s             # ~130 times slower than printf -v 
user    0m5.533s
sys     0m16.724s

這可以幫助您:

#!/bin/bash

echo "script started at $(date +'%Y-%m-%dT%H:%M:%S%:z')"

echo "doing something"
sleep 2

echo "script finished at $(date +'%Y-%m-%dT%H:%M:%S%:z')"

如果調用完整命令對您來說看起來很笨拙,您可能想要創建一個別名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM