Bash for循环在一次迭代后停止而没有错误

时间:2015-12-15 18:42:27

标签: 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
    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

如果我尝试没有cat ...行,脚本会打印所有echo命令,如果我只尝试cat |命令行上的grep命令。

你知道为什么会这样吗?

3 个答案:

答案 0 :(得分:3)

如果您需要在脚本的其他部分使用set -e,则需要处理grep不要停止脚本:

# cat $file | grep "2015-11-0"$i > $i.json
grep "2015-11-0"$i "$file" > $i.json || :

答案 1 :(得分:2)

如果命令以非零状态退出,

set -e强制脚本退出。

+

grep如果无法在文件中找到匹配项,则返回1。

+

dates.json没有 2015-11-02

=

错误

答案 2 :(得分:0)

这是因为我们的set -e导致脚本退出。删除此行,然后它应该工作