我试图从文件中读取字符串,然后将其转换为日期,但由于某种原因它失败了。我实际上正在修改一个目前不起作用的 GeekTool Geeklet。它在本地读取文件并提取目标日期,然后将其用于倒计时时钟。失败的代码行是:
TARGET=$(date -j -f %D_%T $1 +%s)
我知道我可以使用 -v 对脚本中的值进行硬编码,但我想弄清楚为什么这一行不起作用。我似乎找不到任何将字符串从文件转换为日期对象的参考。我也找不到 -j 或 -f 标志的参考...
[编辑] 这是完整的脚本:
#!/bin/bash
# Homework countdown
# BETA - I will update this when I get more time
function countdown
{
CURRENT=$(date +%s)
TARGET=$(date -j -f %D_%T $1 +%s)
LEFT=$((TARGET-CURRENT))
WEEKS=$((LEFT/604800))
DAYS=$(( (LEFT%604800)/86400))
HOURS=$(( (LEFT%86400)/3600))
MINS=$(( (LEFT%3600)/60))
SECS=$((LEFT%60))
lblWEEKS="Weeks"
lblDAYS="Days"
if [ $DAYS == 1 ]
then
lblDAYS="Day"
fi
if [ $WEEKS == 1 ]
then
lblWEEKS="Week"
fi
if [ $HOURS -lt 10 ]
then
HOURS=0$HOURS
fi
if [ $MINS -lt 10 ]
then
MINS=0$MINS
fi
if [ $SECS -lt 10 ]
then
SECS=0$SECS
fi
echo $1
echo $TARGET
echo $2 $WEEKS Weeks, $DAYS $lblDAYS $HOURS:$MINS:$SECS
# Optional extra line between timers
echo
}
DATES=( $( cat /Users/Shared/Deadlines.txt ) )
# Even numbered indices are names, odd numbered indices are dates
if [ ${#DATES[@]} == 0 ]
then
echo "No Deadlines!"
return
fi
for (( i = 0 ; i < ${#DATES[@]} ; i+=2 ))
do
countdown ${DATES[i+1]} ${DATES[i]}
done
该文件仅包含:测试:17/05/2011_12:00
答案1
看起来脚本是为自由BSD。
-f input_fmt
:用作input_fmt
格式字符串来解析提供的new_date,而不是使用默认[[[[[cc]yy]mm]dd]HH]MM[.ss]
格式。解析是使用strptime(3)
.
-j
:请勿尝试设置日期。-f
除了+
将一种日期格式转换为另一种日期格式的选项之外,这还允许您使用该标志。
这些是非标准扩展标准date
命令,只能格式化当前日期。在 Linux(或 Cygwin)或任何其他具有 GNU 日期的系统下,-d
如果您愿意传递不同的日期格式,则可以使用该选项:
TARGET=$(date -d "$1" +%s)
并将脚本称为例如test 2011/05/17 12:00
。对于更高级的解析,首先在 shell 中预处理字符串或调用 Perl 或 Python:
TARGET=$(IFS=/_:; set $1; date +%S $(($2*10000000000+$1*100000000+
$4*1000000+$5*10000+$1)))
TARGET=$(perl -l -e '($day,$month,$year,$h,$m) = split(/[^0-9]+/, $ARGV[0]); print mktime(0, $m, $h, $day, $month, $year-1900)' "$1")
TARGET=$(python -c '
import sys, time;
print time.strftime("%s", time.strptime(sys.argv[1], "%d/%m/%Y_%H:%M"))
' "$1")