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.
vérifier les autorisations et assurez-vous qu'il est exécutable –
Les réponses de ** mobrule ** et ** Hai Vu ** sont ce dont vous avez besoin. –