สร้างตัวแปรเวลาประทับในสคริปต์ทุบตี


375

ฉันพยายามสร้างตัวแปรการประทับเวลาในเชลล์สคริปต์เพื่อให้การบันทึกง่ายขึ้นเล็กน้อย echo $timestampฉันต้องการที่จะสร้างตัวแปรที่จุดเริ่มต้นของสคริปต์และมีมันพิมพ์ออกมาเวลาปัจจุบันทุกครั้งที่ผมออก มันพิสูจน์แล้วว่าเป็นเรื่องยากมากขึ้นจากนั้นฉันก็คิด นี่คือบางสิ่งที่ฉันได้ลอง:

timestamp="(date +"%T")" echo พิมพ์ออกมา (date +"%T")

timestamp="$(date +"%T")" echo พิมพ์เวลาที่ตัวแปรเริ่มต้น

สิ่งอื่น ๆ ที่ฉันได้ลองเป็นเพียงการเปลี่ยนแปลงเล็กน้อยที่ไม่ได้ผลดีกว่านี้ ไม่มีใครรู้วิธีที่จะบรรลุสิ่งที่ฉันพยายามจะทำอย่างไร

คำตอบ:


309

เพื่อให้ได้เวลาประทับปัจจุบันและไม่ใช่เวลาที่กำหนดตัวแปรคงที่เคล็ดลับคือใช้ฟังก์ชันและไม่ใช่ตัวแปร:

#!/bin/bash

# Define a timestamp function
timestamp() {
  date +"%T"
}

# do something...
timestamp # print timestamp
# do something else...
timestamp # print another timestamp
# continue...

ถ้าคุณไม่ชอบรูปแบบที่กำหนดโดย%Tระบุคุณสามารถรวมในเวลาอื่น ๆ แปลง specifiers dateรับการยอมรับจาก สำหรับ GNU dateคุณสามารถค้นหารายการทั้งหมดของตัวระบุเหล่านี้ได้ในเอกสารอย่างเป็นทางการที่นี่: https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html#Time-conversion-specifiers


26
echo "$(timestamp): something happened"ขึ้นอยู่กับว่าคุณตั้งใจจะใช้นี้คุณยังจะต้องใช้แทนคำสั่ง:
chepner

5
สำหรับการจัดรูปแบบนี่เป็นชุดรูปแบบที่ใช้บ่อยและตัดแห้ง: zxq9.com/archives/795
zxq9

175
สำหรับฉันฉันต้องการ date +"%Y-%m-%d_%H-%M-%S"
Kimball Robinson

3
ด้วยเหตุผลบางอย่างนี้ไม่ได้ให้เวลาฉัน แต่เวลาปัจจุบันที่มี ":" อยู่ในระหว่าง
erikbwork

7
ฉันคิดว่าผู้คนจำนวนมากมาถึงคำถามนี้เพื่อหาวิธีในการสร้างการประทับเวลาแบบยูนิกซ์ (อย่างที่ฉันมี) และค้นหาคำตอบโดย dchakarov ที่จะมีประโยชน์มากขึ้นแม้ว่าคำตอบนี้จะตอบคำถามของผู้ถามได้ดีกว่า
vastlysuperiorman

565

หากคุณต้องการได้รับการประทับเวลา unix แล้วคุณต้องใช้:

timestamp=$(date +%s)

%Tจะให้เวลาคุณ เหมือนกับ%H:%M:%S(ผ่านhttp://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/ )


5
แต่ตัวแปรนี้จะเก็บค่าของเวลาที่เริ่มต้นตัวแปรฉันถูกไหม
Linde

9
ฉันเดาว่านี่จะเพิ่มขึ้นมากเพราะมันตอบคำถาม แต่ไม่ตอบคำถาม: D OP ต้องการให้บันทึกเวลาที่แตกต่างกันทุกครั้งในขณะนี้จะเก็บหนึ่งสคริปต์ทั้งหมด
fedorqui 'ดังนั้นหยุดการทำร้าย'

1
ฉันมาที่นี่เพื่อค้นหาสิ่งนี้อย่างแน่นอน dateคือสตริงรูปแบบที่เหมาะสมที่จะได้รับการประทับเวลายูนิกซ์จาก อย่างไรก็ตามฉันยัง upvoted คำตอบ "ถูกต้อง" ฉันไม่ได้มองหามัน แต่มันเป็นคำตอบที่ดีกว่าสำหรับคำถามดั้งเดิมและมันก็มีประโยชน์สำหรับฉันเช่นกัน
vastlysuperiorman

69
DATE=`date "+%Y%m%d"`

DATE_WITH_TIME=`date "+%Y%m%d-%H%M%S"` #add %3N as we want millisecond too

1
ขอบคุณนั่นคือสิ่งที่ฉันต้องการ: การประทับเวลาเป็นตัวแปรที่จะใช้ซ้ำในสคริปต์ของฉัน! ไวยากรณ์ของเชลล์มีความสับสน
Poutrathor

2
+1 สำหรับการเพิ่มส่วนมิลลิวินาที นี้echo $(date +"%Y-%m-%dT%T.%3N%z") แต่ฉันไม่สามารถได้รับมันในการทำงานในสถานี Mac วิธีการทำเช่นเดียวกันใน Mac ขอบคุณ
kosgeinsky

43

รูปแบบ ISO 8601 ( 2018-12-23T12:34:56) สามารถอ่านได้มากกว่า UNIX Timestamp อย่างไรก็ตามสำหรับ OS บางระบบคุณไม่สามารถมี:ชื่อไฟล์ได้ ดังนั้นฉันขอแนะนำให้ใช้สิ่งนี้แทน:

2018-12-23_12-34-56

คุณสามารถใช้คำสั่งต่อไปนี้เพื่อรับการประทับเวลาในรูปแบบนี้:

TIMESTAMP=`date +%Y-%m-%d_%H-%M-%S`

นี่เป็นรูปแบบที่ฉันได้เห็นแอพพลิเคชั่นมากมายที่ใช้ อีกสิ่งที่ดีเกี่ยวกับเรื่องนี้คือถ้าชื่อไฟล์ของคุณเริ่มต้นด้วยสิ่งนี้คุณสามารถเรียงลำดับตัวอักษรและเรียงลำดับตามวันที่


1
ขอบคุณสิ่งนี้ดีมากสำหรับสคริปต์ควบคุมเวอร์ชันของฉัน
Andy

1
TZ=UTC date +...สามารถทำให้พกพาสะดวกยิ่งขึ้นโดยใช้การประทับเวลา UTC
MichaelChirico

17

ฉันใช้ Ubuntu 14.04

วิธีที่ถูกต้องในระบบของฉันควรจะเป็น date +%sวิธีที่ถูกต้องในระบบของฉันควรจะเป็น

การส่งออกของเป็นเหมือนdate +%T12:25:25


15

ใช้การทดแทนคำสั่ง:

timestamp=$( date +%T )

3
นี่คือสิ่งที่ฉันได้ลองแล้วและจะพิมพ์ออกมาเฉพาะเวลาที่ตัวแปรเริ่มต้นเท่านั้น
Dan

10
@ dan08: นั่นเป็นวิธีการทำงานของตัวแปร ใช้ฟังก์ชั่นหากคุณต้องการเอาท์พุทแบบไดนามิก
choroba

11

คุณสามารถใช้ได้

timestamp=`date --rfc-3339=seconds`

สิ่งนี้นำเสนอในรูปแบบ 2014-02-01 15:12:35-05:00

`อักขระback-tick ( ) จะทำให้สิ่งที่อยู่ระหว่างอักขระเหล่านั้นถูกประเมินและมีผลลัพธ์รวมอยู่ในบรรทัด date --helpมีตัวเลือกอื่น ๆ


1
สำหรับเวลาที่ได้รับสิ่งนี้ควรถูกเรียกใช้งานทันทีก่อนที่จะรวมในเอาต์พุตของหน้าจอหรือไฟล์บันทึกที่ต้องการให้มีเวลาของเอาต์พุตที่แสดง
Bill

2
นี่เป็นรูปแบบที่น้อยกว่าอุดมคติสำหรับการประทับเวลาเนื่องจากพื้นที่ในเอาต์พุต อย่าลืมอ้างคำว่า "$ timestamp" ในการใช้งานมิเช่นนั้นคุณจะได้รับสองพารามิเตอร์ไปยังคำสั่ง เช่นtouch $timestampจะสร้างไฟล์สองไฟล์
harschware

8

เวอร์ชันล่าสุดของbashไม่ต้องการการโทรไปยังโปรแกรมภายนอกdate:

printf -v timestamp '%(%T)T'

%(...)Tใช้อาร์กิวเมนต์ที่สอดคล้องกันเป็นเวลาประทับ UNIX และจัดรูปแบบตามstrftimeรูปแบบ - สไตล์ระหว่างวงเล็บ อาร์กิวเมนต์ของ-1สอดคล้องกับเวลาปัจจุบันและเมื่อไม่มีความกำกวมที่จะเกิดขึ้นสามารถละเว้นได้


5

และสำหรับชาวยุโรปเพื่อนของฉันลองใช้สิ่งนี้:

timestamp=$(date +%d-%m-%Y_%H-%M-%S)

จะให้รูปแบบของรูปแบบ: "15-02-2020_19-21-58"

คุณเรียกตัวแปรและรับการแทนค่าสตริงเช่นนี้

$timestamp

1
โปรดพิจารณาการใช้สัญลักษณ์รหัสสำหรับรหัสของคุณ
สาว

4
timestamp=$(awk 'BEGIN {srand(); print srand()}')

srand โดยไม่มีค่าใช้การประทับเวลาปัจจุบันกับการใช้งาน Awk ส่วนใหญ่


ฉันชอบอันนี้มีความคิดสร้างสรรค์มาก!
TobiV
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.