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. ラインを 2 つのコンポーネントに分割IFSできるようにするために使用しますread

  4. する必要をなくすためにサブシェルを使用し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 Context Line Controlにも依存します。

#!/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 に答える