쉘 스크립트를 작성하려고 하는데 더 읽기 쉽게 만들기 위해 명령의 일부를 환경 변수에 넣기로 결정했습니다.
#!/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