2012-07-31 122 views
3

當我運行我的劇本我得到這個錯誤:錯誤在for循環

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 
+0

刪除';'在'做'之前並在換行符上放上'do' – Les 2012-07-31 13:00:50

+1

這應該不是必需的;用分號結束語句是合法的。 – chepner 2012-07-31 13:09:20

+2

名爲「數組」的變量不是數組,它是一個字符串。 – jordanm 2012-07-31 13:12:42

回答

3

幾點建議:

  1. ,並使陣列正確的數組,而不是隻是一個字符串。 (這是唯一 建議,實際上解決您的語法錯誤。)

  2. 報價參數

  3. 使用IFS允許read到您的線路分成了兩個部分組成

  4. 使用一個子shell來消除需要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 
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 
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或空目錄

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 
+0

如果演示文稿非常重要,則需要更多工作來解決此問題。 – 2012-08-01 11:31:22