Jak sformatować wynik daty ze spacjami jako zmienną w skrypcie?


13

Chcę wykonać datepolecenie z ładnym formatowaniem, takie jak to:

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

Ale chcę zapisać to w zmiennej, aby móc wywoływać ze skryptu w następujący sposób: echo "$(nice_date) [WARNING] etc etc"

Jednak to nie działa

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

Jak to zrobić, aby komenda date otrzymała jeden poprawny argument?


Na marginesie, ciąg formatu daty można skrócić, "%F %T"jeśli używasz GNU date.
jordanm,

Problemem jest przestrzeń. Jeśli używasz nice_date="date +%Y-%m-%d-%H:%M:%S", działa. Obecnie nie widzę, jak zabezpieczyć to miejsce przed drugą powłoką.
MadHatter

Odpowiedzi:


13

Przyczyną niepowodzenia twojego przykładu jest sposób podziału słowa powłoki. Po uruchomieniu "$($nice_date)"powłoka wykonuje datepolecenie z dwoma argumentami "+%Y-%m-%d"i "%H:%M:%S". Nie udaje się to, ponieważ ciąg formatu dla daty musi być pojedynczym argumentem.

Najlepszym sposobem na to jest użycie funkcji zamiast przechowywania polecenia w zmiennej:

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"

Jeśli naprawdę chcesz zapisać polecenie w zmiennej, możesz użyć tablicy:

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

Aby uzyskać więcej informacji na temat złożonych przypadków przechowywania polecenia w zmiennej, zobacz BashFAQ 050 .


Dziękuję, ale jestem ciekawy, dlaczego moje podejście nie działa, czy możesz to rozwinąć?
gilbertasm

@gilbertasm Odpowiedź zaktualizowana
Jordan

1
Mam date: extra operand ‘’błędy w obu powyższych podejściach
Jeff Puckett

3

Zgadzam się, że funkcja jest najlepszą drogą. Alternatywnie po prostu zapisz format jako zmienną, a nie całe polecenie:

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

1
@Kusalananda: Całkiem słusznie. Dziękuję Ci! Zaktualizowałem odpowiedź
Adam

Przykro mi, ale echopodstawienie polecenia i są również zbędne.
Kusalananda

1
Tak, były technicznie zbędne w wyciętym przykładzie, którego użyłem (mogę argumentować, że produkują bardziej czytelny kod, ale to kwestia gustu). Zaktualizowałem, aby użyć przykładu z OP, w którym to przypadku są potrzebne
Adam

Tak, ten przykład ma więcej sensu.
Kusalananda

1

Najkrótsza odpowiedź to

#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

Jednym łatwym sposobem jest po prostu „uciec” przestrzeni za pomocą \

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

0

Wypróbuj poniższe:

Musisz dodać symbol „” znajdujący się na klawiszu tyldy na klawiaturze. Symbol mówi powłoce, aby najpierw wykonać polecenie, a następnie przypisać do zmiennej.

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

Ten sam problem, co odpowiedź Iaina.
MadHatter

0

Zamiast:

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

Próbować:

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

Ponadto nie potrzebujesz ostatniego podstawienia polecenia:

date "$nice_date_format"

-1

Miał ten sam problem; musiałem umieścić datę na wydruku awk do przetworzenia przez splunk. użyłem

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

DATE2=`date +%T`

następnie

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

1
Czy potrafisz dokładnie wyjaśnić, jak to odpowiada na pytanie?
G-Man mówi „Reinstate Monica”
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.