어떤 상황에서 경로 이름의 메타 문자를 이스케이프 처리해야 하는지 혼란스럽습니다. 다음 예를 고려하십시오.
저는 다음 작업 디렉토리에 있습니다.
$ echo $PWD
/home/helpermethod/foo[b]ar/foo/bar
이제 나는 모든 것을 뒤에서 벗겨내고 싶다 foo[b]ar
. 이 작업을 수행하기 위해 매개변수 대체를 사용하고 있습니다: /home/helpermethod/foo[b]ar
$ path=$PWD
$ basename=foo[b]ar
$ stripped_path=${path%$basename/*}/$basename
basename 문자열을 올바르게 이스케이프해야 하기 때문에 이는 작동하지 않는 것 같습니다.
$ basename=foo\[b\]ar
$ stripped_path=${path%$basename/*}/$basename
stripped_path
알았어 이제 내가 찾던 걸 찾았어
$ echo "$stripped_path"
/home/helpermethod/foo[b]ar
하지만 이제 이것이 유효한 디렉토리인지 테스트하면
$ [[ -d $stripped_path ]]
이 test
명령은 항상 false를 반환합니다(즉, 반환 값 != 0). 여기서 문제가 무엇입니까? 이스케이프를 해제해야 합니까 stripped_path
?
답변1
stripped_path=${path%"$basename"/*}/$basename
리터럴 문자열 일치에는 패턴 일치 대신 큰따옴표를 사용합니다. 변수를 참조해야 하는 상황 중 하나입니다. 또 다른 상황은 다음과 같습니다.
echo $PWD
위 내용은 다음과 같아야 합니다.
echo "$PWD"
또는 더 나은 방법은 다음과 같습니다.
printf '%s\n' "$PWD"
또는
pwd