Bash 스크립트 작은따옴표 매개변수 및 와일드카드 값

Bash 스크립트 작은따옴표 매개변수 및 와일드카드 값

구성 가능한 디렉터리와 제외된 파일이 포함된 코드 검색 스크립트를 작성하려고 합니다. 스크립트의 주요 부분은 다음 줄입니다.

out=$(grep -TInr$C$W --color=always \
    --exclude={translations} \
    --exclude-dir={build,tmp} \
    "$SEARCH")

$C$W대소문자를 구분하지 않고 정확한 단어 일치를 구성하기 위해 스크립트 매개변수로 설정된 변수 와 $SEARCH검색 문자열이 될 나머지 매개변수만 포함됩니다. 그러나 특정 파일을 무시하는 구현은 아직 효율적이지 않습니다.

검색에서 파일을 제외하기 위해 ~/.codesearch_config다음과 같은 파일을 사용해 보았습니다.

#!/bin/bash

if [[ $PWD == "$HOME/project"* ]]; then
    exclude_directories={.git,build,tmp}
    exclude_files={translations}
fi

물론 여기서의 아이디어는 현재 작업 디렉토리를 기반으로 특정 제외 세트가 로드된다는 것입니다. 하지만 스크립트에 다음을 추가하려고 하면 다음과 같습니다.

--exclude=$exclude_files

bash는 다음과 같이 전체 인수를 작은따옴표로 묶습니다( -x디버그 옵션으로 테스트).

grep -TInrw --color=always '--exclude={translations}' '--exclude-dir={build,tmp}' search_term

내가 원하는 것은 확장입니다 --exclude-dir=build --exclude-dir=tmp. 이러한 변수의 값을 $exclude_명령에 수동으로 추가하면 문제는 매개 변수와 전역 변수 주위에 작은따옴표를 넣는 것입니다. 이런 일이 발생하지 않도록 하려면 어떻게 해야 합니까?

답변1

exclude-dir제외를 위해 배열을 사용하고 -- 및 --exclude옵션 으로 확장해 보세요 .

예를 들어 스크립트의 경우 ~/.codesearch_config(아마도 기본 스크립트에서 가져온 것일까요?):

#! /bin/bash

# temporary array variables
declare -a __exclude_directories
declare -a __exclude_files

if [[ "$PWD" == "$HOME/project"* ]]; then
    __exclude_directories=(.git build tmp)
    __exclude_files=(translations)
elif [[ "$PWD" == "/some/where/else" ]]; then
    __exclude_directories=(foo bar)
    __exclude_files=(abc.txt def.txt xyz.txt)
fi

exclude_directories=''
exclude_files=''

for i in "${__exclude_directories[@]}" ; do
    exclude_directories+=" --exclude-dir '$i'"
done

for i in "${__exclude_files[@]}" ; do
    exclude_files+=" --exclude '$i'"
done

unset __exclude_directories
unset __exclude_files

# comment out or delete the next two lines after you've verified
# that the output is correct.
echo $exclude_directories 
echo $exclude_files

나중에 다음과 같이 사용할 것입니다.

out=$(grep -TInr$C$W --color=always \
      $exclude_files \
      $exclude_directories \
      "$SEARCH")

참고: 여기에서는 변수 주위에 따옴표가 없습니다 $exclude_*. 그렇지 않으면 다음과 같이 처리됩니다.하나의--exclude다중 및 매개변수 대신 매개변수를 각각 사용합니다 --exclude-dir. 이는 변수를 원하지 않고 큰따옴표로 묶어서는 안 되는 매우 드문 경우 중 하나입니다(예: 하나 이상의 변수 내에서 명령줄을 구성하는 경우).

거의 모든 경우에는 습관적으로 변수를 큰따옴표로 묶어야 합니다.

관련 정보