예를 들어 $PWD
/ home의 하위 디렉토리 인지 확인하십시오 . 즉, 한 문자열이 다른 문자열로 시작하는지 확인하기 위해 bash 문자열 작업을 찾고 있습니다.
예를 들어 $PWD
/ home의 하위 디렉토리 인지 확인하십시오 . 즉, 한 문자열이 다른 문자열로 시작하는지 확인하기 위해 bash 문자열 작업을 찾고 있습니다.
답변:
디렉토리가 다른 디렉토리의 하위 디렉토리인지 여부를 확실하게 테스트하려면 문자열 접두어 검사 이상이 필요합니다. Gilles의 답변은이 테스트를 올바르게 수행하는 방법을 자세히 설명합니다.
그러나 간단한 문자열 접두사 검사를 원한다면 (이미 경로를 정규화 했습니까?) 좋은 방법입니다.
test "${PWD##/home/}" != "${PWD}"
경우 $PWD
"/ 홈 /"로 시작, 그것은이 "! ="true를 반환하므로, 오른쪽과 일치하지 의미 왼쪽에서 벗겨됩니다.
${PWD/#$HOME/\~}
"${PWD%%/subdir*}"
사용자가 현재 subdir
의 하위 디렉토리에 있는지 또는 하위 디렉토리에 있는지 여부를 감지하는 데 사용 합니다 subdir
. 이것은 매개 변수 대체에 대한 자세한 정보를 찾는 사람에게 유용합니다. tldp.org/LDP/abs/html/parameter-substitution.html
Bourne 스타일 쉘에서 문자열이 다른 접두어인지 테스트하려면 다음을 수행하십시오.
case $PWD/ in
/home/*) echo "home sweet home";;
*) echo "away from home";;
esac
접미사 또는 부분 문자열 테스트에도 동일한 원칙이 적용됩니다. 에 있습니다 case
구조, 파일 이름과는 달리, *
을 포함한 모든 문자와 일치 /
또는 초기을 .
.
[[ … ]]
구문 을 구현하는 쉘 (예 : 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 (예 : Linux) 가있는 경우 경로에서 기호 링크를 제거 readlink
하는 readlink -f
데 사용할 수 있습니다 .
case $(readlink -f .)/ in $(readlink -f /home)/*) …
그렇지 않으면 pwd
현재 디렉토리를 표시하는 데 사용할 수 있습니다 . 그러나 쉘이 cd
명령을 추적 하고 디렉토리에 "실제"위치가 아닌 디렉토리에 도달 할 때 사용한 이름을 유지하는 경우 쉘 내장을 사용하지 않도록주의해야합니다 .
case $(pwd -P 2>/dev/null || env PWD= pwd)/ in
"$(cd /home && { pwd -P 2>/dev/null || env PWD= pwd; })"/*) …
조잡한 버전 :
[ ${PWD:0:6} = "/home/" ]
문자를 먼저 계산해야 /home/
하고 일반과 같은 것으로 바꿀 수 없다는 단점이 있습니다 $1
.
편집 과 일반화 (감사 @Michael)를 비교 $VAR
한 사용할 수 있습니다
[ "${PWD:0:${#VAR}}" = $VAR ]
${#var}
의 길이 $var
이므로 다음과 같이 일반화 할 수 있습니다.[ "${PWD:0:${#1}}" = "$1" ]
내가 너무 잘 질문을 이해하지 않지만,의 부모 찾기 위해 $ PWD를 수행합니다 dirname $PWD
. 부모의 부모를 찾으려면 다음을 실행하십시오 dirname $(dirname $PWD)
.
/
. 그렇지 않으면 나는로 끝납니다 . 좋아, 재귀 적으로 확인할 수는 있지만 더 쉬운 것이 없습니까?
사용 awk
:
echo $PWD | awk -v h="/home" '$0 ~ h {print "MATCH"}'
흠, [
테스트 STRING1 starts with STRING2
조건 이없는 것은 유감입니다 .
시도해 볼 수도 echo $PWD | grep '^$VAR'
있지만 VAR
특수 기호 가 포함되어 있으면 흥미로운 방식으로 실패 할 수 있습니다 .
awk
의 index
기능은 트릭을 수행 할 수 있어야합니다. 그러나이 모든 것이 테스트하기에 너무 무거워 보입니다.
경로의 검색 된 부분을 찾으면 변수를 "비 웁니다".
[[ -z "${PWD//*\/home\/*/}" ]] && echo "toto"
[ "${PWD##$VAR}" != "$PWD" ]
그리고 이것이 [code-golf] ( stackoverflow.com/questions/tagged/code-golf) 질문 이라면 당신은 나를 두 문자로 이겼을 것입니다 ;-) 더 읽기 ...