환경 변수에서 기호 이스케이프를 방지하는 방법은 무엇입니까?

환경 변수에서 기호 이스케이프를 방지하는 방법은 무엇입니까?

쉘 스크립트를 작성하려고 하는데 더 읽기 쉽게 만들기 위해 명령의 일부를 환경 변수에 넣기로 결정했습니다.

#!/bin/bash
# Variables

name_expression="-type d \( -name .folder1 -o -name .wildcardfolder* -o -name .folder2 \)"

# Commands

find /root/ -maxdepth 1 "$name_expression" -execdir rm -rf {} \;
find /home/ -maxdepth 2 "$name_expression" -execdir rm -rf {} \;

문제는 이 셸을 실행하려고 하면 많은 기호가 따옴표로 묶여 있다는 것입니다.

bash -x ./my_shell.sh 
+ name_expression='-type d \( -name .android -o -name .AndroidStudio* -o -name .gradle \)'
+ find /home/ /root/ -maxdepth 2 '-type d \( -name .folder1 -o -name .wildcardfolder* -o -name .folder2 \)' -execdir rm -rf '{}' ';'
find: unknown predicate `-type d \( -name .folder1 -o -name .wildcardfolder* -o -name .folder2 \)'

이 변수를 수정하지 않고 전달할 수 있는 방법이 있나요?

답변1

name_expression=( -type d \( -name .folder1 -o -name .wildcardfolder\* -o -name .folder2 \) )

find /root/ -maxdepth 1 "${name_expression[@]}" -execdir rm -rf {} \;

명령이 여러 부분을 보려면 따옴표를 풀어야 하는 문자열 매개변수 대신 배열 매개변수를 사용합니다. 이러한 방식으로 분할 및 참조를 제어할 수 있습니다(완전히 제어할 수는 없지만, 즉 부품별로 제어할 수는 없지만 작업에 적합한 방식으로).

전체 제어를 허용하는 또 다른 대안은 을 사용하는 것이지만 eval이로 인해 명령줄의 나머지 부분이 더 복잡해집니다.

답변2

잠재적으로 위험한 전역 확장을 방지하기 위해 수정된 버전:

cleanupdir() {
  # args should be dirname, maxdepth
  find "$1" -maxdepth "$2" -type d \( -name .folder1 -o -name '.wildcardfolder*' -o -name .folder2 \) -execdir rm -rf {} \;
}

cleanupdir /root 1
cleanupdir /home 2

관련 정보