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

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

ファイルリストで単語リストを見つける必要があります。そのため、単語リストをファイルに入れ、forループを使用してファイル内の各単語を読み込み、findコマンドを使用して見つかった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パターン655044810645734729751028が含まれているのでWord count、ゼロではなく、そのelseセクションに入る必要があります。

何が欠けている可能性がありますか?

答え1

$PATHはい意味のある重要な変数。別の名前を選択する必要があります。

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

echo$PATHおそらくシェルが組み込まれているので、動作する必要はありません。for待つのも同じだ。

答え2

最初、適切なものを設定し$PATH(回答を確認してください)カミール・マコロフスキー):

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

echo PATH=$PATH

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

またはコマンドのフルパスを追加できますfindfindどこに配置するのかわからない場合は、次の手順を実行してください。

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「for」のある行を読まない理由を読んでください。そしてファイル(データストリーム、変数)を1行ずつ(および/またはフィールドごとに)読み取る方法は?

関連情報