Bash for循环在一次迭代后停止,没有错误
假设我有一个文件Bash for循环在一次迭代后停止,没有错误,bash,if-statement,for-loop,grep,Bash,If Statement,For Loop,Grep,假设我有一个文件dates.json: 2015-11-01T12:01:52 2015-11-03T03:58:57 2015-11-09T02:43:59 2015-11-10T08:22:00 2015-11-11T05:14:51 2015-11-11T12:47:02 2015-11-13T08:33:40 我想根据日期将行分隔为不同的文件。 我制作了以下脚本: #!/bin/bash set -e file="$1" for i in $(seq 1 1 31); do i
dates.json
:
2015-11-01T12:01:52
2015-11-03T03:58:57
2015-11-09T02:43:59
2015-11-10T08:22:00
2015-11-11T05:14:51
2015-11-11T12:47:02
2015-11-13T08:33:40
我想根据日期将行分隔为不同的文件。
我制作了以下脚本:
#!/bin/bash
set -e
file="$1"
for i in $(seq 1 1 31); do
if [ $i -lt 10 ]; then
echo 'looking for 2015-11-0'$i
cat $file | grep "2015-11-0"$i > $i.json
else
echo 'looking for 2015-11-'$i
cat $file | grep "2015-11-"$i > $i.json
fi
done
当我执行时,我得到以下信息:
$ bash example.sh dates.json
looking for 2015-11-01
looking for 2015-11-02
如果我试着不带猫。。。行脚本打印所有echo命令,如果我在命令行上只尝试cat | grep命令,它就会工作
你知道它为什么会这样吗?这是因为我们的set-e导致脚本退出。删除这一行,如果命令以非零状态退出,那么它应该可以工作
set-e
强制脚本退出
+
grep
如果在文件中找不到匹配项,则返回1
+
dates.json没有2015-11-02
=
错误如果您需要在脚本的其他部分设置-e,则需要处理
grep
以不停止脚本:
# cat $file | grep "2015-11-0"$i > $i.json
grep "2015-11-0"$i "$file" > $i.json || :
注释掉
set-e
并使用bash-x example.sh dates.json
如果你不知道它做什么,为什么要使用指令(set-e
)?@CharlesDuffy我只是想在任何错误情况下停止脚本,你的意思是我不知道set-e
做什么或其他什么?是的,set-e
在任何错误时停止,而grep
在文件中找不到匹配项是错误的。所以它完全按照你告诉它的做。顺便说一句,你的$i
扩展应该在引号内。也就是说:grep“2015-11-0$i”“$file”>“$i.json”
;否则,这些扩展很容易出现字符串拆分和全局化。当然,答案是正确的——但可能值得在引用时修复它。@CharlesDuffy引用有什么问题@choroba在这种情况下,|:
做什么?@dtj,:
是true
的同义词。引用的问题是,未引用的扩展是字符串拆分和全局扩展,您可能不想使用字符串拆分或全局扩展$i
。谢谢!我认为grep找不到匹配项不会算作set-e的错误option@dtj,如果在grep的退出状态中没有报告匹配失败,则不能使用if grep-q-e模式文件;然后…
判断是否存在匹配项…,而且,UNIX退出状态不区分“成功的真”、“成功的假”和“失败”;它只是零(成功)或非零(失败)——任何更细粒度的定义都是特定于应用程序的。