bash 스크립트의 명령줄에서 명령으로 전달된 따옴표를 이스케이프 처리하는 방법

bash 스크립트의 명령줄에서 명령으로 전달된 따옴표를 이스케이프 처리하는 방법

저는 데비안 10을 사용하고 있습니다. 나는 종종 텍스트를 검색하기 위해 명령을 실행합니다.

sudo grep -rin <path> -e <text to search for>

이 명령을 많이 사용하기 때문에 일부를 자동화하고 다음과 같이 호출하는 간단한 스크립트를 만들고 싶었습니다.

stx -p <path> -t <text to search for>

따라서 다음과 같이 호출할 수 있습니다.

stx -p /var/www -t 'navbar ul'
stx -p ~/.wine/drive_c/Program\ Files -t 'asdf ghjk'

경로와 검색 텍스트에 공백이 포함될 수 있으며 이로 인해 따옴표 및 이스케이프를 처리하는 방법에 대한 질문이 생깁니다. 스크립트:

#!/usr/bin/bash
#search text
while [ -n "$1" ]; do
        case "$1" in
                -p) path="$2" # path to start search in
                shift
                ;;
                -t) txt="$2" # text to search for
                shift
                ;;
        esac
        shift
done

echo sudo grep -rin $path -e \'$txt\'
#exit 0

sudo grep -rin $path -e '$txt'

#       grep options:
#       r       recursive
#       i       case-insensitive
#       n       show line number

에코에서 명령이 올바른 것으로 보입니다. 하지만 이 명령을 실행하면 경로와 텍스트 부분에 다른 문제가 발생합니다. 경로 부분은 공백이 포함된 파일 이름에서는 작동하지 않는 것 같고, 텍스트 부분은 각 단어를 개별적으로 검색하는 것 같습니다.

답변1

문제는 큰따옴표로 묶인 변수에 있는 것이 아닙니다.

쉘에서 올바르게 인용하는 방법을 배우는 것은 매우 중요합니다.

공백/메타 문자를 포함하는 모든 리터럴은 "큰따옴표"로 처리합니다.모든확장: "$var", "$(command "$var")", "${array[@]}", "a & b". 'single quotes'코드나 텍스트 의 경우 $'s: 'Costs $5 US'.ssh host 'echo "$HOSTNAME"'

바라보다
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words

관련 정보