以下作業沒有問題:
timestamp=$(TZ=America/New_York date)
echo $timestamp
這(如果保存在名為 的檔案中/tmp/foo)導致:
$ /tmp/foo
Thu Dec 23 21:03:41 EST 2021
此代碼也有效:
timezone=$1
timestamp=$(TZ=$timezone date)
echo "$timestamp"
嗯……有點;當有引數運行時,它會做我想要的:
$ date
Thu Dec 23 21:05:03 EST 2021
$ /tmp/foo Asia/Calcutta
Fri Dec 24 07:35:11 IST 2021
但是在沒有引數的情況下運行時,它會恢復為 UTC(因為 TZ 被設定為空值,這與根本沒有設定 TZ 時執行的代碼不同):
$ /tmp/foo Asia/Calcutta
Fri Dec 24 07:37:16 IST 2021
$ /tmp/foo
Fri Dec 24 02:07:19 UTC 2021
所以我應該只在子 shell 中設定 TZ 變數,如果它提供的話,對嗎?這不起作用:
timezone=$1
if [[ -n "$timezone" ]]; then
tzstring="TZ=$timezone"
fi
timestamp=$($tzstring date)
echo "$timestamp"
沒有爭論,這很好:
$ /tmp/foo
Thu Dec 23 21:09:07 EST 2021
但是有一個論點,它失敗了:
$ /tmp/foo Asia/Calcutta
/tmp/foo: line 12: TZ=Asia/Calcutta: No such file or directory
它試圖執行第一個元素。
我可以讓它完全按照我想要的方式作業:
if [[ -n "$timezone" ]]; then
timestamp=$(TZ=$timezone date)
else
timestamp=$(date)
fi
這導致:
$ /tmp/foo
Thu Dec 23 21:13:19 EST 2021
$ /tmp/foo Asia/Calcutta
Fri Dec 24 07:43:21 IST 2021
但肯定有更好的方法來減少代碼重復。我寧愿不使用函式,但如果我沒有那個規定,我也許可以制作 TZ local。我能想到的做所有我想做的事情的唯一方法是使用eval,我并不是真的愿意這樣做(而且我也不確定我是否知道如何去做)。
uj5u.com熱心網友回復:
僅當有引數時才設定時區。您可以通過在您捕獲其輸出的子shell 中匯出 $TZ 來做到這一點。
timestamp=$(if [ "$1" ] ; then export TZ=$1 ; fi; date)
echo $timestamp
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/392356.html
下一篇:Grep計數有2個要求
