当我在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中的每一行都有类似&#34; test&#34;的字符串,即行中没有空格。 headers.txt真正包含的是从C项目中的所有头文件中提取的函数名列表:)我以前的代码中没有返回错误,它只是循环中不会运行的grep命令。我想要做的是搜索headers.txt中每个函数的所有C文件,并在每次搜索之前提示我
答案 0 :(得分:3)
grep
可能会失败,因为文件名包含空格。
不要使用大写字母变量。那些更好地被环境使用
永远不要尝试解析ls
输出。改用globbing
如果你正在写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