저는 데비안 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