วิธีจัดรูปแบบวันที่ออกพร้อมช่องว่างเป็นตัวแปรในสคริปต์ได้อย่างไร


13

ฉันต้องการที่จะทำให้dateคำสั่งด้วยการจัดรูปแบบที่ดีเช่นนี้:

$ date +"%Y-%m-%d %H:%M:%S"
2015-09-17 16:51:58

แต่ฉันต้องการบันทึกในตัวแปรดังนั้นฉันสามารถโทรจากสคริปต์เช่นนี้ echo "$(nice_date) [WARNING] etc etc"

อย่างไรก็ตามมันไม่ทำงาน

$ nice_date="date +%Y-%m-%d %H:%M:%S"
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S
Try 'date --help' for more information.

$ nice_date="date +\"%Y-%m-%d %H:%M:%S\""
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S"’
Try 'date --help' for more information.

$ nice_date='date +"%Y-%m-%d %H:%M:%S"'
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S"
Try 'date --help' for more information.

อะไรคือวิธีที่ถูกต้องในการทำเช่นนี้คำสั่ง date เพื่อรับอาร์กิวเมนต์ที่ถูกต้องหนึ่งข้อ


ตามบันทึกข้างสตริงรูปแบบวันที่ของคุณสามารถลงไป"%F %T"ถ้าคุณกำลังใช้ dateGNU
jordanm

ปัญหาคือพื้นที่ ถ้าคุณใช้nice_date="date +%Y-%m-%d-%H:%M:%S"มันใช้งานได้ ฉันไม่สามารถดูวิธีการป้องกันพื้นที่จากเปลือกที่สองในขณะนี้
MadHatter

คำตอบ:


13

เหตุผลที่ตัวอย่างของคุณล้มเหลวเป็นเพราะวิธีการแยกคำของเชลล์ทำงาน เมื่อคุณเรียกใช้"$($nice_date)"เปลือกจะดำเนินการdateคำสั่งที่มีสองข้อโต้แย้งและ"+%Y-%m-%d" "%H:%M:%S"สิ่งนี้ล้มเหลวเนื่องจากสตริงรูปแบบสำหรับวันที่ต้องเป็นอาร์กิวเมนต์เดียว

วิธีที่ดีที่สุดในการทำเช่นนี้คือการใช้ฟังก์ชั่นแทนการเก็บคำสั่งในตัวแปร:

format_date() {
  # echo is not needed
  date "+%Y-%m-%d %H:%M:%S" "$1"
}
format_date
format_date "2015-09-17 16:51:58"
echo "$(format_date) [WARNING] etc etc"

หากคุณต้องการเก็บคำสั่งไว้ในตัวแปรคุณสามารถใช้อาร์เรย์ได้:

nice_date=(date "+%Y-%m-%d %H:%M:%S")
# again echo not needed
"${nice_date[@]}" "2015-09-17 16:51:58"

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับกรณีที่ซับซ้อนในการจัดเก็บคำสั่งในตัวแปรดูBashFAQ 050


ขอบคุณ แต่ฉันอยากรู้ว่าทำไมวิธีการของฉันไม่ทำงานคุณสามารถอธิบายอย่างละเอียดได้หรือไม่
gilbertasm

อัปเดตคำตอบ @gilbertasm แล้ว
jordanm

1
ฉันได้รับdate: extra operand ‘’ข้อผิดพลาดทั้งสองวิธีด้านบน
Jeff Puckett

3

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

$ nice_date='+%Y-%m-%d %H:%M:%S'
$ echo "$(date "$nice_date") [WARNING] etc etc"

1
@ Kusalananda: ค่อนข้างถูกต้อง ขอขอบคุณ! ได้อัปเดตคำตอบแล้ว
Adam

และอืมขอโทษ แต่การechoแทนที่และคำสั่งก็ไม่จำเป็นเช่นกัน
Kusalananda

1
ใช่พวกเขามีความฟุ่มเฟือยในทางเทคนิคในตัวอย่างแบบตัดลงที่ฉันใช้ (ฉันสามารถโต้แย้งได้ว่าพวกเขาสร้างโค้ดที่อ่านได้มากขึ้น อัปเดตให้ใช้ตัวอย่างจาก OP ซึ่งเป็นกรณีที่จำเป็น
Adam

ใช่ตัวอย่างนั้นสมเหตุสมผลดีกว่า
Kusalananda

1

คำตอบที่สั้นที่สุดคือ

#if you want to store in a variable
now=$(date '+%F" "%T');
echo $now

#or direct output (single quote may not needed)
date '+%F" "%T'

1

วิธีที่ง่ายวิธีหนึ่งก็คือ 'หลบหนี' ช่องว่างด้วย \

nice_date="date +%Y-%m-%d\ %H:%M:%S"

0

โปรดลองด้านล่าง:

คุณต้องเพิ่มสัญลักษณ์ "` "สัญลักษณ์ที่อยู่บนปุ่มตัวหนอนในแป้นพิมพ์ สัญลักษณ์บอกว่าเชลล์ใช้คำสั่งก่อนแล้วจึงกำหนดให้กับตัวแปร

[root@RHEL01 ~]# My_Var=`date +"%Y-%m-%d %H:%M:%S"`
[root@RHEL01 ~]# echo $My_Var
2015-09-17 10:05:30
[root@RHEL01 ~]#

ปัญหาเช่นเดียวกับคำตอบของ Iain
MadHatter

0

แทน:

nice_date="date +%Y-%m-%d %H:%M:%S"
echo "$($nice_date)"

ลอง:

nice_date_format="+%Y-%m-%d %H:%M:%S"
echo $(date "$nice_date_format")

นอกจากนี้คุณไม่จำเป็นต้องทดแทนคำสั่งล่าสุด:

date "$nice_date_format"

-1

มีปัญหาเดียวกัน; ต้องใส่วันที่ลงในพิมพ์ awk สำหรับการประมวลผลโดย splunk ฉันใช้

DATE1=`date +%Y-%m-%d`

DATE2=`date +%T`

แล้วก็

awk ' { print "['$DATE1' '$DATE2'] topic=" $1, etc

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