경로 이름에서 메타 문자를 언제 이스케이프해야 할지 잘 모르겠습니다.

경로 이름에서 메타 문자를 언제 이스케이프해야 할지 잘 모르겠습니다.

어떤 상황에서 경로 이름의 메타 문자를 이스케이프 처리해야 하는지 혼란스럽습니다. 다음 예를 고려하십시오.

저는 다음 작업 디렉토리에 있습니다.

$ 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

관련 정보