2012-04-21 196 views
0

当我在TEST(第18行)中使用grep时,它完美地工作。当我执行完全相同的命令时,但在for循环(第40行)内,它不起作用。为什么?现在我已经把这个问题放在头脑上了。Linux shell脚本:grep不能在for循环中工作

#!/bin/bash 
clear   

sourcelist=`ls *.c` 
headerlist=`ls *.h` 
FILE="headers.txt" 

TEST="receive_elevator_data" #this is one typical entry in headers.tex 
echo "TEST" 
grep $TEST *.c -n 

MODE="h" 

if [ "$MODE" = "h" ] 
then 
echo "Searching.." 
#for entry in $(cut -f 1 $FILE) 
for entry in `cat $FILE` 
    do 
    echo "Looking at entry in $FILE: " 
    echo $entry 
    echo "Press any button to search, <s> for skip, <e> to exit" 
    read -e INPUT2 
    if [ "$INPUT2" = "s" ] 
    then 
     continue 
    fi 
    if [ "$INPUT2" = "n" ] 
    then 
     exit 1 #exit shell script 
    else 
     grep -n "${entry}" ${sourcelist} 
    fi 
done 
fi 

只是为了阐明:headers.txt中的每一行都有“test”这样的字符串,即行中没有空格。什么headers.txt真正包含的是从C项目中的所有头文件中提取的函数名称列表:)在我以前的代码中没有返回的错误,它只是在循环中不会运行的grep命令。我想要做的是在headers.txt中搜索每个函数的所有C文件,并在每次搜索前提示我

+0

'的sed 's/^/\ t /' 脚本| xclip',你准备粘贴;) – c00kiemon5ter 2012-04-21 23:02:13

+0

选择代码并点击小花括号? – 2012-04-21 23:03:39

+0

还有什么是返回的错误?你应该包含这些信息。 – c00kiemon5ter 2012-04-21 23:20:23

回答

3

grep可能因为文件名包含空格而失败。

不使用大写字母变异。那些更好地被环境使用。
永远不要试图解析ls输出。改用globbing。
如果你正在写bash,那么比[更喜欢[[
不要cat file来阅读它。而不是read它在一个while循环。
总是引用你的变量。他们也很容易找到如果分组。
将数组列表视为一个数组。
如果你有使用``喜欢$()可以嵌套,并且还引用它(foo="$(cmd ..)"

#!/bin/bash 
clear   

sourcelist=(*.c) 
headerlist=(*.h) 
file="headers.txt" 
test="receive_elevator_data" # this is one typical entry in headers.tex 
mode="h" 

echo "searching test" 
grep -n "$test" "${sourcelist[@]}" 

if [[ "$mode" == "h" ]]; then 
    echo "Searching.." 
    while read -r entry; do 
     printf "Looking at entry in %s: %s\n" "$file" "$entry" 
     read -p "Press any button to search, <s> for skip, <e> to exit" -e answer 
     [[ "$answer" = "s" ]] && continue 
     [[ "$answer" = "e" ]] && exit 1 # exit shell script 
     grep -n "$entry" "${sourcelist[@]}" 
    done < "$file" 
fi 
+0

所有不错的建议(+1)... Re:*反引号* vs'$()'..反引号也可以处理一些不同的转义字符..从'info bash':*当旧式反引号形式的替换是反斜杠 保留其字面意思,除非后面跟有$,'或\。不带反斜杠的第一个反引号终止命令子 置换。使用$(command)表单时,括号内的所有字符构成命令;没有特别处理。* – 2012-04-22 00:43:28

+0

Tnx!代码看起来很整洁,但不起作用 - 至少不是按照预期的那样。只是为了澄清一下:headers.txt中的每一行都有“test”这样的字符串,即行中没有空格。什么headers.txt真正包含的是从C项目中的所有头文件中提取的函数名称列表:)在我以前的代码中没有返回的错误,它只是在循环中不会运行的grep命令。我想要做的是在headers.txt中搜索每个函数的所有C文件,并在每次搜索前提示我。这段代码没有提示我的系统(ubuntu统一) – Lars 2012-04-22 08:42:26