3

当我运行我的脚本时,我收到了这个错误:

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

4 回答 4

3

几点建议:

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

  2. 报价参数

  3. 用于IFS允许read将您的行拆分为两个组件

  4. 使用 subshel​​l 来消除对cd $base.

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


#!/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
于 2012-07-31T13:36:29.667 回答
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
于 2012-07-31T13:04:30.173 回答
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 或空目录

于 2012-08-01T11:24:11.547 回答
1

这个解决方案甚至更简单,而且还处理豁免文件名。它也取决于 xargs 和 Gnu grep上下文行控制

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

find . -type f ! -name "1234.sh" |
    xargs egrep -A $spread -B $spread $pattern 
于 2012-08-01T11:29:32.747 回答