2016-08-16 33 views
0

我有我的下面的shell脚本,它在文件内搜索字符串并返回计数。不知道为什么它陷在中间。请任何人都可以解释。

#!/bin/bash 

read -p "Enter file to be searched: " $file 
read -p "Enter the word you want to search for: " $word 

count=$(grep -o "^${word}:" $file | wc -l) 
echo "The count for `$word`: " $count 

OUTPUT:

[email protected]:~/scripts$ ./wordsearch.sh 
Enter file to be searched: apple.txt 
Enter the word you want to search for: apple 
^C 
+0

'$读取时file'治疗**'$ file'的当前值* *作为要读取的变量的名称(sorta - 因为它没有被正确引用,实际上它做的事情比这更复杂)。如果该变量为空,则最终读入“REPLY”的默认变量。 'read file',而是读入名为'file'的变量。 –

+0

请看看:[我应该怎么做当有人回答我的问题?](http://stackoverflow.com/help/someone-answers) – Cyrus

+0

...顺便说一下,http://shellcheck.net/会自动检测到那里有错误(您正在尝试在建立它之前使用变量'$ file'的值)。 –

回答

2

read需要传递一个变量file,而不是$file

#!/bin/bash 

read -p "Enter file to be searched: " file 
read -p "Enter the word you want to search for: " word 

count=$(grep -o -e "$word" "$file" | wc -l) 
echo "The count for $word: $count" 

什么以前发生的事情是,你的file变量是空的,所以你的代码正在运行:

count=$(grep -o "^${word}:" | wc -l) 

...有没有指定的输入,所以它会永远等待标准输入。


顺便说一句 - 你不需要wc这个; grep可以使用-c自变量(在GNU实现中也称为--count)本身发出计数器。如果希望通过柜台的话,而不是行去,可以使用tr把每个字占据一行:

count=$(tr '[[:space:]]' '\n' <"$file" | grep -c -e "$word") 
+0

哦,是啊......我怎么会这么愚蠢!只是一个我早已离开的触摸问题。顺便说一句,还有一个问题。我正在使用的文件的内容是“这是苹果搜索的测试文件,脚本将搜索苹果在此处提及的次数,最后它会打印出苹果数字”,其中苹果被提及三次,但脚本打印出0.我们能解决这个问题吗? –

+0

你的模式(我故意假设)期望在一行的开头找到这个单词,后面跟着':'。如果那*不是*意图的话......我会编辑。 –

+0

('^ $ {word}:'中,'^'限制只匹配文件的最前面,而':'限制匹配那个单词后面紧跟着一个':'的地方)。 –