Обозначения:
`$myDate2`
расширяет $ myDate2 и выполняет команду (и я вернусь к тому, почему с этим возникают проблемы), а затем перехватывает вывод и пытается запустить вывод.
То, что вы ищете, это eval
:
eval $myDate2
Обрабатывать кавычки сложно - и eval
часто является частью ответа. Когда вы строите строку с внутренними кавычками, вам нужно использовать eval
, чтобы оболочка собрала кавычки.
Один очень полезный инструмент, который у меня есть, это программа al
- для списка аргументов.
#include <stdio.h>
int main(int argc, char **argv)
{
while (*++argv != 0)
puts(*argv);
return(0);
}
Печатает каждый отдельный аргумент в отдельной строке. Это было почти первое, что я сделал, глядя на то, что вы делаете.
myDate=`date +'%y%m%d_%H%M%S'`
myDate1=`echo $myDate | sed 's/_/ /g'`
myDate2=`echo $myDate1 | sed 's/\([0-9][0-9][0-9][0-9][0-9][0-9]\) \([0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)/\/bin\/date -d "\1 \2:\3:\4" +%s/'`
print $myDate2
#`$myDate2`
al $myDate2
eval al $myDate2
eval $myDate2
Результат трассировки был:
+ date +%y%m%d_%H%M%S
+ myDate=091029_082546
+ sed 's/_/ /g'
+ echo 091029_082546
+ myDate1='091029 082546'
+ sed 's/\([0-9][0-9][0-9][0-9][0-9][0-9]\) \([0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)/\/bin\/date -d "\1 \2:\3:\4" +%s/'
+ echo 091029 082546
+ myDate2='/bin/date -d "091029 08:25:46" +%s'
+ print /bin/date -d '"091029' '08:25:46"' +%s
/bin/date -d "091029 08:25:46" +%s
+ al /bin/date -d '"091029' '08:25:46"' +%s
/bin/date
-d
"091029
08:25:46"
+%s
+ eval al /bin/date -d '"091029' '08:25:46"' +%s
+ al /bin/date -d '091029 08:25:46' +%s
/bin/date
-d
091029 08:25:46
+%s
+ eval /bin/date -d '"091029' '08:25:46"' +%s
+ /bin/date -d '091029 08:25:46' +%s
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
[-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Обратите внимание, что когда я запускал 'al $ myDate2', строка даты разделялась на два аргумента, но когда я запускал 'eval al $ myDate2', строка представляла собой один аргумент - как требовалось. Я тестировал MacOS X, где команда data не принимает указанный вами формат строки даты - это отдельная проблема. Но для исцеления строки требуется 'eval'.
Я даже не обратился к вопросу о том, что пытается сделать скрипт оболочки.
Я понял из ответа Хай Ву, что мы действительно после текущего времени в секундах с начала эпохи; Я могу понять, как это может быть.
В MacOS X это получается тривиально:
date +'%s'
(где одинарные кавычки действительно не нужны). Страница справочника MacOS X также содержит пример:
date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"
Это кажется немного запутанным - но позволит вам найти секунды с начала эпохи для любой даты, ранее заданной командой date - или дату, которая будет дана в какое-то время в будущем (путем замены обратных кавычек) дата с предыдущей строкой).
Около года назад я написал программы 'systime' для печати текущего времени в виде количества секунд после эпохи, а также программу 'timestamp' для преобразования таких значений обратно в форматированные даты - потому что ни одна из стандартных версии команды date поддерживали такие механизмы тогда (до того, как стандарт C стал стандартом и, следовательно, до того, как strftime () стал широко доступным). У меня также есть программа 'strptime' для преобразования форматированной даты в метку времени. Ах, хорошо - приятно знать, что стандартные программы теперь могут это делать.
Тем не менее, я отмечаю, что команда 'date' в MacOS является надмножеством стандартной версии POSIX; Я подозреваю, что команда 'date' в Linux (GNU) - это отдельный надмножество стандарта POSIX, и так далее для каждой платформы.