쉘 스크립트에서 명령이 작동하지 않는 찾기

쉘 스크립트에서 명령이 작동하지 않는 찾기

파일 목록에서 단어 목록을 찾아야 합니다. 그래서 단어 목록을 파일에 넣고 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패턴 655044810645과 가 734729751028있으므로 Word count0이 아니어야 하고 else해당 섹션으로 들어가야 합니다.

무엇이 누락되었을 수 있나요?

답변1

$PATH의미있는 중요한 변수. 다른 이름을 선택해야 합니다.

이 경우에는 원인이 없기 find때문에 실행 파일을 찾을 수 없습니다 . $PATH때문에 알림을 받지 못했습니다 2>/dev/null.

echo$PATH아마도 쉘이 내장되어 있으므로 작동할 필요가 없습니다 . for기다리는 것도 마찬가지다.

답변2

첫 번째, 적절한 것을 설정하고 $PATH(답변을 확인하세요)카밀 마코로프스키):

적절한 사용자(루트?)로 로그인하고 다음을 실행합니다.

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!"for"가 있는 줄을 읽지 않는 이유를 읽어보세요.그리고파일(데이터 스트림, 변수)을 한 줄씩(및/또는 필드별로) 읽는 방법은 무엇입니까?

관련 정보