Làm cách nào để định dạng đầu ra ngày với khoảng trắng dưới dạng biến trong tập lệnh?


13

Tôi muốn làm date lệnh với định dạng đẹp như thế này:

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

Nhưng tôi muốn lưu cái này trong biến, vì vậy tôi có thể gọi từ tập lệnh như thế này: echo "$(nice_date) [WARNING] etc etc"

Tuy nhiên, nó không hoạt động

$ 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.

Cách chính xác để làm điều này là gì, để lệnh date có được một đối số đúng?


Là một lưu ý phụ, chuỗi định dạng ngày của bạn có thể được rút ngắn thành "%F %T"nếu bạn đang sử dụng GNU date.
jordanm

Vấn đề là không gian. Nếu bạn sử dụng nice_date="date +%Y-%m-%d-%H:%M:%S", nó hoạt động. Hiện tại tôi không thể thấy làm thế nào để bảo vệ không gian đó khỏi lớp vỏ thứ hai.
MadHatter

Câu trả lời:


13

Lý do ví dụ của bạn thất bại là do cách thức phân tách từ của shell. Khi bạn chạy "$($nice_date)", shell đang thực thi datelệnh với hai đối số "+%Y-%m-%d""%H:%M:%S". Điều này không thành công vì chuỗi định dạng cho ngày phải là một đối số duy nhất.

Cách tốt nhất để làm điều này là sử dụng một hàm thay vì lưu trữ lệnh trong một biến:

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"

Nếu bạn thực sự muốn lưu trữ lệnh trong một biến, bạn có thể sử dụng một mảng:

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

Để biết thêm chi tiết về các trường hợp phức tạp của việc lưu trữ lệnh trong một biến, hãy xem BashFAQ 050 .


Cảm ơn bạn, nhưng tôi tò mò tại sao cách tiếp cận của tôi không hiệu quả, bạn có thể giải thích về điều đó không?
gilbertasm

@gilbertasm câu trả lời được cập nhật
jordanm

1
Tôi đang gặp date: extra operand ‘’lỗi với cả hai cách tiếp cận ở trên
Jeff Puckett

3

Tôi đồng ý một chức năng là cách tốt nhất để đi. Như một cách thay thế, chỉ cần lưu trữ định dạng dưới dạng một biến chứ không phải toàn bộ lệnh:

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

1
@Kusalananda: Hoàn toàn đúng. Cảm ơn bạn! Đã cập nhật câu trả lời
Adam

Và, ừ, xin lỗi, nhưng sự echothay thế và lệnh cũng không cần thiết.
Kusalananda

1
Vâng, chúng là kỹ thuật thừa trong ví dụ cắt giảm mà tôi đã sử dụng (tôi có thể lập luận rằng chúng tạo ra mã dễ đọc hơn nhưng đó là một câu hỏi về hương vị). Đã cập nhật để sử dụng ví dụ từ OP, trong trường hợp đó là cần thiết
Adam

Vâng, ví dụ đó có ý nghĩa hơn.
Kusalananda

1

Câu trả lời ngắn nhất là

#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

Một cách dễ dàng là chỉ cần 'thoát' không gian bằng một \

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

0

Vui lòng thử dưới đây:

Bạn cần thêm biểu tượng "` "biểu tượng trên phím dấu ngã trong bàn phím. Biểu tượng cho biết shell để thực thi lệnh trước và sau đó gán cho biến.

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

Vấn đề tương tự như câu trả lời của Iain.
MadHatter

0

Thay vì:

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

Thử:

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

Ngoài ra, bạn không cần thay thế lệnh cuối cùng:

date "$nice_date_format"

-1

Có cùng một vấn đề; đã phải đặt một ngày vào một bản in awk để xử lý bằng cách tách. Tôi đã sử dụng

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

DATE2=`date +%T`

sau đó

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

1
Bạn có thể giải thích chính xác làm thế nào điều này trả lời câu hỏi?
G-Man nói 'Phục hồi Monica'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.