파일에 제공한 $OPTARG를 기반으로 검색하려면 어떻게 해야 합니까?

파일에 제공한 $OPTARG를 기반으로 검색하려면 어떻게 해야 합니까?

특정 텍스트를 검색하기 위한 실행 파일을 만들려고 합니다. 내가 전달한 값이 포함된 데이터 파일의 모든 행을 검색하고 싶습니다. 그래서 저는 이라는 데이터 파일 .addr_book과 이라는 실행 파일을 만들었습니다.lookup.ksh

Lookuo.ksh:

#!/bin/ksh

while getopts ":a:" option;
do
 case $option in
  a)
   echo searching for $OPTARG
   cat .addr_book | grep -o '$OPTARG.*' 
   ;;
  *)
   echo "invalid option -$OPTARG"
   ;;
 esac
done

파일을 실행하면 ./lookup.ksh -a test 다음과 같이 표시됩니다.searching for test

.addr_book | grep -o '$OPTARG.*' 고양이한테 뭔가 문제가 있는 것 같아요 .

어떤 도움이라도 대단히 감사하겠습니다.

답변1

변수 확장 주위에 작은따옴표를 사용하면 쉘이 변수를 확장하지 못하게 됩니다. 큰따옴표를 사용해야 합니다.

개선을 위한 제안은 다음과 같습니다.

#!/bin/sh

while getopts "a:" option; do
   case $option in
       a) word=$OPTARG ;;
       *) echo 'error' >&2
          exit 1
   esac
done

if [ -z "$word" ]; then
    echo 'Missing word to search for' >&2
    exit 1
fi

printf 'Searching for "%s"\n' "$word"
grep -o "$word.*" .addr_book

몇 가지 사항을 변경했습니다.

  • 스크립트는 ksh특정 기능을 사용하지 않아서 스크립트로 만들었습니다 /bin/sh.
  • 스크립트의 주요 부분( )에서 명령줄 구문 분석을 grep분리했습니다 . 이렇게 하면 스크립트를 유지 관리하기가 더 쉬워집니다.
  • :문자열의 첫 번째 문자는 잘못된 명령줄 인수를 직접 처리한다는 getopts것을 나타냅니다 . getopts소스의 일반적인 진단 메시지로 getopts충분하므로 이는 거의 필요하지 않습니다.
  • 진단 메시지(오류 메시지나 경고 등 스크립트의 일반 출력에 포함되지 않은 모든 항목)는 표준 오류 스트림( >&2)으로 전송되어야 합니다.
  • 검색할 용어가 누락되었거나 비어 있는 경우 진단 메시지가 생성됩니다.
  • 변수 데이터의 출력은 완료를 위해 사용되어야 합니다 printf.
  • cat제거하다.

관련 정보