2016-08-16 61 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}:'中,'^'限制只匹配文件的最前面,而':'限制匹配那個單詞後面緊跟着一個':'的地方)。 –