예를 들어 $PWD
/home의 하위 디렉터리인지 확인합니다. 즉, 문자열이 다른 문자열로 시작하는지 확인하기 위해 bash 문자열 작업을 검색하고 있습니다.
답변1
Bourne 스타일 셸에서 문자열이 다른 문자열의 접두사인지 테스트하려면 다음을 수행하세요.
case $PWD/ in
/home/*) echo "home sweet home";;
*) echo "away from home";;
esac
접미사 또는 하위 문자열 테스트에도 동일한 원칙이 적용됩니다. case
파일 이름과 달리 a 또는 이니셜을 *
포함하여 모든 문자가 구성에서 일치합니다 ./
.
이 구문을 구현하는 셸 [[ … ]]
(예: bash, ksh 및 zsh)에서는 문자열을 패턴과 일치시키는 데 사용할 수 있습니다. (이 [
명령은 문자열 동일성만 테스트할 수 있습니다.)
if [[ $PWD/ = /home/* ]]; then …
현재 디렉터리가 아래에 있는지 구체적으로 테스트하는 경우 /home
심볼릭 링크가 있기 때문에 간단한 하위 문자열 테스트로는 충분하지 않습니다.
/home
자체 파일 시스템인 경우 현재 .
디렉터리( )가 해당 파일 시스템에 있는지 테스트합니다.
if [ "$(df -P . | awk 'NR==2 {print $6}')" = "/home" ]; then
echo 'The current directory is on the /home filesystem'
fi
NetBSD, OpenBSD, GNU, busybox 또는 toybox(마지막 3개는 Debian, OpenWrt 또는 Android와 같은 Linux 기반 시스템에서 일반적임)가 있는 경우 경로에서 심볼릭 링크 제거를 readlink
사용할 수 있습니다 .readlink -f
case $(readlink -f .)/ in "$(readlink -f /home)"/*) …
일부 시스템에는 다음 realpath
명령도 있습니다(GNU 도구 상자에도 있으며 이제는 선호됩니다 readlink
).
case $(realpath .)/ in "$(realpath /home)"/*) …
셸에는 수정자가 있는 zsh
자체 연산자도 있습니다 .realpath()
:P
if () [[ $1:P/ = $2:P/* ]] . /home; then …
pwd
그렇지 않으면 현재 디렉터리 표시를 사용할 수 있습니다 . 그러나 쉘이 cd
명령을 추적하고 "실제" 위치가 아닌 디렉토리에 액세스하는 데 사용되는 이름을 유지하는 경우 내장 쉘을 사용하지 않도록 주의해야 합니다 .
case $(pwd -P 2>/dev/null || env PWD= pwd)/ in
"$(cd /home && { pwd -P 2>/dev/null || env PWD= pwd; })"/*) …
답변2
디렉터리가 다른 디렉터리의 하위 디렉터리인지 여부를 안정적으로 테스트하려면 문자열 접두사 확인 이상이 필요합니다. Giles의 답변은 이 테스트를 올바르게 수행하는 방법을 자세히 설명합니다.
그러나 간단한 문자열 접두어 확인을 정말로 원한다면(경로를 정규화했습니까?) 다음이 좋은 대안입니다.
test "${PWD##/home/}" != "${PWD}"
"/home/"으로 시작 하면 $PWD
왼쪽에서 제거됩니다. 즉, 오른쪽과 일치하지 않으므로 "!="는 true를 반환합니다.
답변3
대략적인 버전:
[ "${PWD:0:6}" = /home/ ]
단점은 문자 수를 먼저 계산해야 하며 /home/
이와 같은 일반적인 것으로 대체 할 수 없다는 것입니다 $1
.
편집하다$VAR
(@Michael에게 감사드립니다) 사용할 수 있는 것과 비교하기 위해 일반화
[ "${PWD:0:${#VAR}}" = "$VAR" ]
답변4
질문이 잘 이해가 안가는데 부모님이 직접 찾아보셔야 할 것 같아요$PWD, dirname -- "$PWD"
하다. 부모의 부모를 찾으려면 dirname -- "$(dirname -- "$PWD")"
다음을 실행하십시오.