특정 텍스트를 검색하기 위한 실행 파일을 만들려고 합니다. 내가 전달한 값이 포함된 데이터 파일의 모든 행을 검색하고 싶습니다. 그래서 저는 이라는 데이터 파일 .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
제거하다.