当我运行脚本时,我收到此错误:
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 :(得分:3)
一些建议:
使数组成为一个合适的数组,而不仅仅是一个字符串。 (这是唯一的 实际上解决了语法错误的建议。)
引用参数
使用IFS
允许read
将您的专线拆分为两个组件
使用子shell消除对cd $base
。
您的大多数分号都是不必要的。
#!/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