вопрос о дате оболочки Linux - PullRequest
0 голосов
/ 29 октября 2009
shell>/bin/date -d "091029 20:18:02" +%s
1256827682

Аналогичным образом я создал сценарий оболочки:

#My.sh
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`

Но он не выполняет вышеуказанную команду. ЗАЧЕМ?

Ответы [ 3 ]

4 голосов
/ 29 октября 2009

В дополнение к вышеприведенным решениям я хотел бы предложить помощнику перейти на myDate2:

$ myDate=$(date +'/bin/date -d "%y%m%d %H:%M:%S" +%%s')
$ echo $myDate
/bin/date -d "091029 09:06:29" +%s
4 голосов
/ 29 октября 2009

Обратные пометки в последней строке выполняют команду, а выполняет вывод этой команды , что, вероятно, не то, что вы пытаетесь сделать - когда я запускаю это, я получаю вывод -bash: 1256829614: command not found , Уберите галочки в последней строке, чтобы она просто гласила

    $myDate2
3 голосов
/ 29 октября 2009

Обозначения:

`$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, и так далее для каждой платформы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...