Bash 스크립트에 작은따옴표가 표시되지 않도록 방지

Bash 스크립트에 작은따옴표가 표시되지 않도록 방지

grep 명령의 바로 가기인 bash 스크립트가 있습니다. 나는 그것을 이렇게 부른다:

stx -p /var/www -t 'my text'

그러면 다음 명령이 실행됩니다.

sudo grep -rinI /var/www -e 'my text'

특정 확장자(.css, .js 등)를 가진 파일을 포함하거나 제외하는 기능을 추가하려고 합니다. 스크립트는 다음과 같습니다.

#!/usr/bin/bash
#search for text in files

set -x #echo all commands

while [ -n "$1" ]; do
        case "$1" in 
                -p) path="$2" # path to start search in
                shift
                ;;  
                -t) txt="$2" # text to search for
                shift
                ;;   
                -i) inc="$2"    
                        #echo 'inc: ' $inc
                        include="--include=\*.${inc}" # file type to include
                shift
                ;;  
                -?) 
                        echo 'stx usage:'
                        echo '-p    path to search in'
                        echo '-t    text to search for'
                        exit 0
                shift
                ;;
        esac 
        shift
done


result=$(sudo grep -rinI $include "$path" -e "$txt")
echo "$result"

#       grep options:
#       r               recursive
#       i               case-insensitive
#       n               show line number   
#       I               ignore binary files
#       --include       only include files with specified extension

이 명령을 실행하면 어떤 이유로 $include 변수 주위에 작은따옴표가 추가됩니다. 따라서 이 명령을 실행하여 .js 파일에서 "내 텍스트"를 검색하려고 하면 다음과 같습니다.

stx -p /var/www -t 'my text' -i js

이는 다음을 생성합니다.

sudo grep -rinI '--include=\*.js' /var/www -e 'my text'

--include*.js 주위의 작은따옴표로 인해 문제가 발생합니다. 이러한 따옴표를 삽입하는 것을 어떻게 막을 수 있나요?

답변1

muru가 지적했듯이 이는 여기서 사용된 백슬래시 이스케이프 때문에 발생합니다.

-i) inc="$2"    
  #echo 'inc: ' $inc
  include="--include=\*.${inc}" # file type to include

*와일드카드확실히큰따옴표 내에서 확장한다는 것은 (따옴표를 통해) 이스케이프되었음을 의미하며, 이는 백슬래시 이스케이프도 문자 그대로 처리된다는 의미입니다.

다음과 같이 변경할 수 있습니다.

-i) include="--include=*.${2}";;

여기서는 다양한 상황에서 백슬래시 이스케이프 처리 방법을 확인할 수 있습니다.

$ echo \*
*
$ echo "\*"
\*
$ echo "\$"
$

첫 번째 예에서는 이스케이프 후 제거됩니다. 두 번째 예에서는 이스케이프 *
할 필요가 없으므로 *문자 그대로 유지됩니다 (여기서) .
$할 수 있는작은따옴표로 확장되었으므로 제거하세요.

관련 정보