Bash 将带后缀的日期()添加到sqlite3查询
希望将代码的2017-02-14部分替换为昨天的日期作为函数,因为我希望能够使用此查询,而无需每天修改它。我试着修改论坛上的其他代码,但没有成功 我正在搜索一个数据库,试图找到某个特定事件在前一天开始的时间,这是需要类似表达式和下划线的地方。我尝试使用sqlite3的date()函数,但找不到添加“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”后缀以查找特定条目的方法 此外,我对bash还不够熟悉,无法将Bash 将带后缀的日期()添加到sqlite3查询,bash,sqlite,Bash,Sqlite,希望将代码的2017-02-14部分替换为昨天的日期作为函数,因为我希望能够使用此查询,而无需每天修改它。我试着修改论坛上的其他代码,但没有成功 我正在搜索一个数据库,试图找到某个特定事件在前一天开始的时间,这是需要类似表达式和下划线的地方。我尝试使用sqlite3的date()函数,但找不到添加“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”后缀以查找特定条目的方法 此外,我对bash还不够熟悉,无法将date+'%Y-%m-%d'传递到查询中,并在查询末尾添加“\u
date+'%Y-%m-%d'
传递到查询中,并在查询末尾添加“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”后缀,以便能够找到我要查找的条目
#!/bin/bash
yesterday=$(date -d yesterday +'%Y-%m-%d __:__:__')
startDetails=sqlite3 hub.db 'select substr(timestamp,12,19)
from OET where entryID="0"
and timestamp like "2017-02-14 __:__:__";'
stopDetails=sqlite3 hub.db 'select substr(timestamp,12,19)
from OET where entryID="5"
and timestamp like "'"$yesterday"'";'
echo "Start: " $startDetails "Finish: "$stopDetails
exit 0
fi
我以一种简化的形式复制了我要做的事情。在当前状态下,第一个查询正确返回,列出了当天的两个开始时间,但是第二个查询不返回任何内容,在调试中运行此脚本将返回以下结果
+ $'\r'
checkWebID.sh: line 2: $'\r': command not found
++ date -d yesterday '+%Y-%m-%d __:__:__'
' yesterday='2017-02-14 __:__:__
++ sqlite3 hub.db 'select substr(timestamp,12,19)
from OET where entryID="0"
and timestamp like "2017-02-15 __:__:__";'
+ Details='04:49:01
'4:07:42
";'sqlite3 hub.db 'select substr(timestamp,12,19)
from OET where entryID="5"
and timestamp like "2017-02-14 __:__:__
+ StopDetails=$'\r'
+ $'\r'
checkWebID.sh: line 6: $'\r': command not found
+ echo 'Start: ' 04:49:01 $'14:07:42\r' 'Finish: ' $'\r\r'
Finish: :49:01 14:07:42
+ exit $'0\r'
: numeric argument required: 0
假设您使用的是GNU
date
,它可能非常简单:
yesterday=$(date -d yesterday +'%Y-%m-%d __:__:__')
startDetails=`sqlite3 hub.db 'select substr(timestamp,12,19)
from OET where entryID="0"
and timestamp like "'"$yesterday"'";'`
引文必须精心编排。在片段中:
'select … like "'"$yesterday"'";'
第一个双引号是文字;下一个单引号终止单引号字符串;“$dayerd”
用双引号将shell变量dayerd
中的值括起来(这些引号不是可选的,因为$dayerd
的值中有空格,但您可以更改它们,使其成为可选的);然后单引号开始(恢复)单引号字符串,双引号是字符串的一部分,然后单引号再次结束单引号字符串
一般来说,你应该优先使用
$(…)
符号而不是反勾号,特别是如果你计划在降价中讨论事情(但是有技术原因选择$(…)
独立于SO和降价)。谢谢你的回答,澄清了这种做法,但是,它还没有完全奏效。我正在使用GNU/linux Ubuntu 11.04,我已经更新了原始问题。调试的第一步是打印-在本例中,可能使用sh-x yourscript.sh
查看$dayed
中的内容(对我来说,2017-02-14T19:15:37,日期-d昨天+“%Y/%m/%d”命令产生了2017/02/13,这是我们想要的。你得到了同等的吗?你也设法丢失了命令中的回号-当你更新问题时,这是抄写错误吗?(此外,一旦你得到答案,一般不应从问题中删除原始材料。你确实(或多或少)保留了足够的原始材料,但要小心!)我注意到,您的运行文本和问题的原始版本使用了2017/02/14
,而修订后的查询使用了2017-02-14
——选择一个有效的,并修复保存在$date
中的值以匹配。这是对日期的格式字符串的简单更改。SQL的修订版1和修订版2使用了/
表示法;第3版和第4版使用-
表示法。选择毒药,但不要尝试混合它们。当然,这两种表示法都可能有效。在SQL中,字符串周围也使用双引号;标准SQL要求单引号,但我习惯于使用不那么繁琐的RDBMS。很抱歉,我自然会这样做写日期,现在应该是正确的,我希望日期格式为YYYY-MM-DD
此外,不要介意2017-02-15和2017-02-14的不同日期。你是对的,我确实在从终端复制到此处时丢失了回号,它们出现在脚本中,似乎正在做它们需要做的事情。请记住这一点或者以后的参考谢谢。我用来参考的源代码都使用了双引号,它似乎没有影响它,但会对此进行一些研究。其中带有$'\r'
的错误消息表明您一直在玩Windows机器,并且您的脚本包含CRLF(DOS样式)行结尾,而不是像Unix一样的NL(LF)行结尾。请修复文件格式,使其作为Unix而不是DOS工作(在Vim中,:set fileformat=unix
可能会完成这项工作;还有许多其他方法可以做到这一点,而且还有很多问题,在这方面,更改行尾是相关的解决方案。使用命令dos2unix,我能够将文件格式从DOS转换为unix,运行脚本现在返回所需的结果。感谢您的帮助,您已经完成了省得我在泥泞中跋涉。干杯