2009-10-29 5 views
0
shell>/bin/date -d "091029 20:18:02" +%s 
1256827682 

De même, je créé script shell:date de shell linux question

#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` 

Mais il n'exécute pas au-dessus de la commande. Pourquoi?

+0

vérifier les autorisations et assurez-vous qu'il est exécutable –

+0

Les réponses de ** mobrule ** et ** Hai Vu ** sont ce dont vous avez besoin. –

Répondre

3

La notation:

`$myDate2` 

myDate2 $ et étend exécute la commande (et je reviendrai pourquoi il y a des problèmes avec cette), puis capture la sortie et essaie d'exécuter la sortie.

Ce que vous cherchez est eval:

eval $myDate2 

citations La manipulation est délicate - et eval est souvent une partie de la réponse. Lorsque vous générez une chaîne avec des guillemets internes, vous devez utiliser eval pour que le shell mette les citations ensemble.

Un outil très utile que j'ai est un programme appelé al - pour la liste des arguments.

#include <stdio.h> 
int main(int argc, char **argv) 
{ 
    while (*++argv != 0) 
     puts(*argv); 
    return(0); 
} 

Il imprime chaque argument séparé sur une ligne distincte. C'était presque la première chose que j'ai faite en regardant ce que vous faites.

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 

La sortie de trace de c'était:

+ 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] 

Notez comment quand je courais al $ myDate2 la chaîne de date a été scindée en deux arguments, mais quand je courais eval al $ myDate2 ' , la chaîne était un argument - comme requis. Je testais sur MacOS X, où la commande de données n'accepte pas le format de chaîne de date que vous avez fourni - c'est un problème complètement séparé. Mais obtenir la chaîne guérie nécessite 'eval'. Je n'ai même pas résolu le problème de ce que le script shell essayait de faire.

Je crois comprendre d'après la réponse de Hai Vu que nous sommes vraiment après l'heure actuelle en secondes depuis l'époque; Je peux voir en quelque sorte comment cela pourrait être.

Sur Mac OS X, qui est obtenu trivialement:

date +'%s' 

(où les guillemets simples sont vraiment pas nécessaires).La page de manuel MacOS X comprend également l'exemple:

 date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s" 

Cela semble un peu alambiquée - mais vous permettra de trouver les secondes depuis l'époque pour une date donnée précédemment par la commande date - ou date qui sera donnée à un certain moment dans le futur (en remplaçant la date citée en arrière par la chaîne précédente). Il y a quelque temps, j'ai écrit des programmes 'systime' pour imprimer l'heure actuelle comme le nombre de secondes après l'époque, et aussi un programme 'horodatage' pour convertir ces valeurs en dates formatées - parce qu'aucun des les versions standard de la commande 'date' supportaient de tels mécanismes à l'époque (avant que le standard C soit standard, et donc avant que strftime() soit largement disponible). J'ai aussi un programme 'strptime' pour convertir une date formatée en horodatage. Ah bon - bon de savoir que les programmes standard peuvent maintenant le faire.

Cependant, je note que la commande 'date' de MacOS est un surensemble de la version standard POSIX; Je soupçonne que la commande Linux (GNU) 'date' est un sur-ensemble différent de la norme POSIX, et ainsi de suite pour chaque plate-forme.

4

Les backticks dans la dernière ligne exécute la commande et exécute alors la sortie de cette commande, ce qui est probablement pas ce que vous essayez de faire - quand je lance ce que je reçois la sortie -bash: 1256829614: command not found. Retirez les accents graves sur la dernière ligne afin qu'il dit juste

$myDate2 
+0

eval $ myDate2 a fait l'affaire. output = 'eval $ myDate2' echo $ output –

4

En plus des solutions ci-dessus, je voudrais offrir assistant pour se rendre à myDate2:

$ myDate=$(date +'/bin/date -d "%y%m%d %H:%M:%S" +%%s') 
$ echo $myDate 
/bin/date -d "091029 09:06:29" +%s 
+0

C'est tellement mieux. Toutes ces gyrations 'sed 'sont complètement inutiles. –

+0

Je n'ai même pas regardé ce que le script était censé accomplir; juste à la mécanique de la façon dont il l'a atteint. –

+0

@Jonathan Leffler: J'ai complètement compris ce que vous avez fait. Cet article est un complément à votre solution. –