0

当我在 TEST(第 18 行)中使用 grep 时,它可以完美运行。当我执行完全相同的命令,但在 for 循环内(第 40 行)时,它不起作用。为什么?我已经在这个问题上绞尽脑汁太久了。

#!/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文件,并在每次搜索前提示我

4

1 回答 1

3

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

不要使用大写字母 vars。这些更适合环境使用。
永远不要尝试解析ls输出。改用通配符。
如果您正在编写 bash,则更[[喜欢[.
不要cat file阅读它。而是read在一个while循环中。
总是引用你的变量。如果分组,它们也更容易找到。
将文件列表视为数组。
如果您必须使用可以嵌套的``prefer ,并且还引用它( )$()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
于 2012-04-21T23:11:38.873 回答