이 Bash 스크립트에서 이 옵션이 작동하지 않는 이유는 무엇입니까?

이 Bash 스크립트에서 이 옵션이 작동하지 않는 이유는 무엇입니까?

-i | --ignore-case오류 처리 옵션을 포함하도록 다음 기능을 확장하고 있습니다.

#!/bin/sh
[ $# -ne 1 ] && echo "1 argument is needed" && exit 1
find $HOME -type f -name "*.tex" -exec grep -il "$1" {} + | vim -

확장 코드

#!/bin/sh
################################
# Check if parameters options  #
# are given on the commandline #
################################
while (( "$#" )); do
   case "$1" in
    -h | --help)
        echo "help menu"
        exit 0
        ;;
    -i | --ignore-case)
        [ $# -ne 2 ] && echo "1 argumenst i needed" && exit 1
        find $HOME -type f -name "*.tex" -exec grep -il "$1" {} + | vim -
        exit 0
        ;;
     -*)
        echo "Error: Unknown option: $1" >&2
        exit 1
        ;;
      *) # No more options
        break
        ;;
   esac

   shift # not sure if needed
done

# Do this if no cases chosen
[ $# -ne 1 ] && echo "1 argument is needed" && exit 1
find $HOME -type f -name "*.tex" -exec grep -l "$1" {} + | vim -

결과

  1. haetex "TODO". 예상 출력은 출력과 동일합니다. 합격!
  2. haetex -i "TODO". 예상 결과: 대소문자 무시를 사용하여 검색합니다. 결과: 빈 파일.

이 옵션이 -i여기서 작동하지 않는 이유는 무엇입니까?

답변1

grep검색 문자열 대신 방금 테스트한 옵션이 포함되어 있으므로 대소문자를 -i검색으로 변경하세요.$2$1

find $HOME -type f -name "*.tex" -exec grep -il "$2" {} + | vim -

case여러 옵션을 처리하려면 명령문 에서 하나의 변수만 설정하는 것이 좋습니다 .

-i | --ignore-case)
    [ $# -ne 2 ] && echo "1 argumenst i needed" && exit 1
    case_option=-i
    ;;

그러면 find루프 뒤의 명령은 다음과 같습니다.

find $HOME -type f -name "*.tex" -exec grep -l $case_option "$1" {} + | vim -

이 경우 검색 문자열이 매개변수의 시작 부분으로 이동되었기 $1때문에 작동합니다.shift

따라서 전체 스크립트는 다음과 같습니다.

while (( "$#" )); do
   case "$1" in
    -h | --help)
        echo "help menu"
        exit 0
        ;;
    -i | --ignore-case)
        [ $# -ne 2 ] && echo "1 argumenst i needed" && exit 1
        case_option=-i
        ;;
     -*)
        echo "Error: Unknown option: $1" >&2
        exit 1
        ;;
      *) # No more options
        break
        ;;
   esac

   shift # not sure if needed
done

find $HOME -type f -name "*.tex" -exec grep -l $case_option "$1" {} + | vim -

관련 정보