Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将带后缀的日期()添加到sqlite3查询_Bash_Sqlite - Fatal编程技术网

Bash 将带后缀的日期()添加到sqlite3查询

Bash 将带后缀的日期()添加到sqlite3查询,bash,sqlite,Bash,Sqlite,希望将代码的2017-02-14部分替换为昨天的日期作为函数,因为我希望能够使用此查询,而无需每天修改它。我试着修改论坛上的其他代码,但没有成功 我正在搜索一个数据库,试图找到某个特定事件在前一天开始的时间,这是需要类似表达式和下划线的地方。我尝试使用sqlite3的date()函数,但找不到添加“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”后缀以查找特定条目的方法 此外,我对bash还不够熟悉,无法将date+'%Y-%m-%d'传递到查询中,并在查询末尾添加“\u

希望将代码的2017-02-14部分替换为昨天的日期作为函数,因为我希望能够使用此查询,而无需每天修改它。我试着修改论坛上的其他代码,但没有成功

我正在搜索一个数据库,试图找到某个特定事件在前一天开始的时间,这是需要类似表达式和下划线的地方。我尝试使用sqlite3的date()函数,但找不到添加“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”后缀以查找特定条目的方法

此外,我对bash还不够熟悉,无法将
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,运行脚本现在返回所需的结果。感谢您的帮助,您已经完成了省得我在泥泞中跋涉。干杯