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