错误的for循环

时间:2012-07-31 12:56:07

标签: bash for-loop grep

当我运行脚本时,我收到此错误:

234.sh: line 3: syntax error near unexpected token `do
234.sh: line 3: `for folder in $array ; do

我没有看到错误。帮助

#!/bin/bash
base=$(pwd)
array=`find * -type d`
 for folder in $array ; do
  cd $folder ;
  grep -n $1 * | while read line ;
   do    name=$(echo "$line" | cut -f1 -d:) ;
        if [ "$name" == "1234.sh" ]; then
        continue ;
        else
        string=$(echo "$line" | cut -f2 -d:) ;
        a=$(expr $string - 10)
        if [ $a -lt 1 ] ; then 
        a=1 ;
        fi ;
        b=$(expr $string + 10) ;   
        echo "-----------------------"
        echo $name:$a
        sed -n $a,${b}p $name;
        fi ;
    done
   cd $base ;
done

4 个答案:

答案 0 :(得分:3)

一些建议:

  1. 使数组成为一个合适的数组,而不仅仅是一个字符串。 (这是唯一的     实际上解决了语法错误的建议。)

  2. 引用参数

  3. 使用IFS允许read将您的专线拆分为两个组件

  4. 使用子shell消除对cd $base

  5. 的需要
  6. 您的大多数分号都是不必要的。


  7. #!/bin/bash
    array=( `find * -type d` )
    for folder in "${array[@]}" ; do
      ( cd $folder
        grep -n "$1" * | while IFS=: read fname count match; do
          [ "$fname" == "1234.sh" ] && continue
    
          a=$(expr $count - 10); [ $a -lt 1 ] && a=1
          b=$(expr $count + 10) 
          echo "-----------------------"
          echo $fname:$a
          sed -n $a,${b}p $fname
        done
      )
    done
    

答案 1 :(得分:1)

#!/bin/bash

base=$(pwd)
array=`find . -type d`
for folder in $array
do
  cd $folder
  grep -n $1 * | while read line
  do    
      name=$(echo "$line" | cut -f1 -d:)
      if [ "$name" == "1234.sh" ]
      then
        continue
      else
        string=$(echo "$line" | cut -f2 -d:)
        a=$(expr $string - 10)
        if [ $a -lt 1 ]
        then 
          a=1
        fi
        b=$(expr $string + 10)
        echo -----------------------
        echo $name:$a
        sed -n $a,${b}p $name
      fi
  done
  cd $base
done

答案 2 :(得分:1)

你想要实现的目标是什么样的 目录树中所有文件上指定模式的上下文grep。

我建议您使用Gnu grep Context Line Control

#!/bin/bash
base=$(pwd)
spread=10
pattern=$1

find . -type d | while read dir; do
    (cd $dir && egrep -A $spread -B $spread $pattern *)
done

这是简单版本,不处理1234.sh或空目录

答案 3 :(得分:1)

此解决方案更简单,另外还处理免除文件名。 它还取决于xargs和Gnu grep Context Line Control

#!/bin/bash
spread=10
pattern=$1

find . -type f ! -name "1234.sh" |
    xargs egrep -A $spread -B $spread $pattern