web-dev-qa-db-ja.com

シェルスクリプトでコマンドが機能しない

ファイルのリストで単語のリストを検索する必要があります。したがって、単語リストをファイルに入れ、forループを使用してファイル内の各Wordを読み取り、findコマンドを使用して、見つかったファイルのリスト内のそのWordをgrepします。

上記のLinuxのフレーバーを使用しています

bash-3.1$ uname
HP-UX

そして以下は私のシェルスクリプトです。

  #!/bin/sh
PATH="/NO/20171013"
STRING=`/usr/bin/cat /home/test/STAT44_test.txt`
for LINE in ${STRING}
do
  echo "find ${PATH} -type f -name \"*.txt\" -exec grep -w "${LINE}" {} \; 2>/dev/null | /usr/bin/wc -l"
  LINES=`find ${PATH} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | /usr/bin/wc -l`
  echo "LINES count is ${LINES}"
  if [ ${LINES} -eq 0 ]
  then
        echo "In not found"
#       echo "${LINE} is not found in ${PATH}" >> /home/test/STAT44_not_found.out
  else
        echo "In Found"
#       echo "${LINE} is found in ${PATH}" >> /home/test/STAT44_found.out
  fi
done

Findコマンドfind ${PATH} -type f -name "*.txt" -exec grep -w '${LINE}' {} \; 2>/dev/nullは、コマンドプロンプトでは完全に機能しますが、上記のようにシェルスクリプトで使用した場合、出力は行われません。

echo $?の出力は0ですが、findコマンドは出力を生成しません。

スクリプトの出力は

find /NO/20171013 -type f -name "*.txt" -exec grep -w 655044810645 {} \; 2>/dev/null | /usr/bin/wc -l
LINES count is 0
In not found
find /NO/20171013 -type f -name "*.txt" -exec grep -w 734729751028 {} \; 2>/dev/null | /usr/bin/wc -l
LINES count is 0
In not found

実際、*.txtの下の/NO/20171013ファイルには、パターン655044810645および734729751028のファイルがあります。したがって、Word countは0であってはならず、else部分に入る必要があります。

何が欠けているのでしょうか?

2

最初に、適切な$PATHをセットアップします(そして Kamil Maciorowski による回答を参照してください):

適切なユーザー(root?)でログインして実行します。

echo PATH=$PATH

スクリプトの先頭に出力を追加します

[〜#〜]または[〜#〜]findコマンドにフルパスを追加できます。 findの配置場所がわからない場合は、次のコマンドを実行します。

which find

出力は次のようになります:/usr/bin/find

そしてループ内で間違いがあります

一重引用符を二重引用符(${LINE}前後)に置き換える必要があります。そうしないと、変数が解釈されません。

echo "find ${PATHS} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | wc -l"
LINES=`find ${PATHS} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | wc -l`

いくつかのメモ:

  1. cat fileは必要ありません。代わりにループを使用してください。ただし、whileではなくforのみを使用してください! Read for you't read lines with "for" and How can read a file(data stream、variable)line-by-line(and/or field-by-field )?
2
Egor Vasilyev

$PATH意味のある重要な変数 です。別の名前を選択してください。

この場合、$PATHが原因ではないため、find実行可能ファイルが見つかりません。 2>/dev/nullにより、通知されません。

echoはおそらくShellビルトインであり、動作するために$PATHを必要としません。 forなどでも同じ.

4