Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.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 for循环在一次迭代后停止,没有错误_Bash_If Statement_For Loop_Grep - Fatal编程技术网

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退出状态不区分“成功的真”、“成功的假”和“失败”;它只是零(成功)或非零(失败)——任何更细粒度的定义都是特定于应用程序的。