2016-08-16 5 views
0

ファイル内の文字列を検索してカウントを返すシェルスクリプトがあります。なぜそれが途中で止まっているのか分かりません。誰でも説明してください。

#!/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

変数を渡す必要がありreadfile$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とも呼ばれます)を使用して、カウンタ自体を発行することができます。あなたはそのカウンタは言葉ではなく線で行きたい場合は、1が独自の行に各単語を入れてtrを使用することができます。治療され

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

ああええ...どうすればそんなに愚かなことができますか?私が長い間残してきた触れ合いの問題。ところで、まだ問題があります。私が使用しているファイルには、 "Appleの検索用のテストファイルです。ここでAppleがここに記載されている回数が検索されます。最後にAppleの番号が印刷されます"というリンゴが三度記述されていますが、この問題を克服できますか? –

+0

あなたのパターン(私は意図的に仮定しています)は、単語が行の先頭にあり、その後に ':'が続くことを期待しています。それが意図ではない*の場合...私は編集します。 –

+0

( '^ $ {word}:'では、 '^'はファイルの最前面でのみ一致するように制限し、 ':'は単語の直後に ':'がある箇所に一致するように制限します。 –

関連する問題