셸 스크립트 내에서 디렉터리의 존재 여부를 확인하는 데 사용할 수 있는 명령은 무엇인가요?
셸 스크립트에 디렉터리가 있는지 확인하려면 다음을 사용할 수 있습니다:
if [ -d "$DIRECTORY" ]; then
# Control will enter here if $DIRECTORY exists.
fi
또는 디렉터리가 존재하지 않는지 확인합니다:
if [ ! -d "$DIRECTORY" ]; then
# Control will enter here if $DIRECTORY doesn't exist.
fi
그러나 Jon Ericson 이 지적한 것처럼 디렉토리에 대한 심볼릭 링크도 이 검사를 통과한다는 점을 고려하지 않으면 후속 명령이 의도한 대로 작동하지 않을 수 있습니다. 예를 들어, 이것을 실행합니다:
ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then
rmdir "$SYMLINK"
fi
를 실행하면 오류 메시지가 표시됩니다:
rmdir: failed to remove `symlink': Not a directory
따라서 후속 명령에서 디렉터리를 기대하는 경우 심볼릭 링크를 다르게 처리해야 할 수 있습니다:
if [ -d "$LINK_OR_DIR" ]; then
if [ -L "$LINK_OR_DIR" ]; then
# It is a symlink!
# Symbolic link specific commands go here.
rm "$LINK_OR_DIR"
else
# It's a directory!
# Directory command goes here.
rmdir "$LINK_OR_DIR"
fi
fi
변수를 묶는 데 사용된 큰따옴표에 특히 주목하세요. 그 이유는 다른 답변에서 8jean 님이 설명했습니다.
변수에 공백이나 기타 비정상적인 문자가 포함되어 있으면 스크립트가 실패 할 수 있습니다.
항상 그들을 참조할 때 반드시 com/go/4e6b330a_kr 큰따옴표로 랩 배시 (bash) 는 스크립트입니다. 요즘 아이들은 함께 키울 수 있다는 생각에 공간 및 많은 다른 재미있는 그 디렉터리 이름을 가질 수 있습니다. (스페이스! # 39, t, 우리는 다시 내 일이 없는 didn& 돌림무늬 스페이스! )
그러던 어느 날, 그 중 한 아이들이 스크립트는 실행됩니다 함께 ',', '와' $ 디렉터리입니다 설정되었습니다 " 내 M0viez" 너회의 스크립트입니다 파멸해요 # 39, t want 너회가 don& iqn. 그래서 이.
if [ -d "$DIRECTORY" ]; then
# Will enter here if $DIRECTORY exists, even if it contains spaces
fi
d** 테스트는 의외의 결과를 가져올 수 있다는 점에 유의하세요:
$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory
파일 아래: "언제 디렉토리가 디렉토리가 아닌가요?" 정답: "디렉토리에 대한 심볼릭 링크일 때입니다." 조금 더 철저한 테스트입니다:
if [ -d t ]; then
if [ -L t ]; then
rm t
else
rmdir t
fi
fi
자세한 내용은 Bash 조건식 및 [[
내장 명령](https://www.gnu.org/software/bash/manual/bash.html#index-_005b) 및 [[[
복합 명령](https://www.gnu.org/software/bash/manual/bash.html#index-_005b_005b)에 대한 Bash 매뉴얼에서 확인할 수 있습니다.
디렉터리입니다 여부를 확인할 수 있는 경우 다음과 같은 간단한 구조를 사용할 수 있습니다.
if [ -d directory/path to a directory ] ; then
#Things to do
else #if needed #also: elif [new condition]
# things to do
fi
또한 제외어 할 수 있어
if [ ! -d directory/path to a directory ] ; then
# things to do when not an existing directory
와 같은 문법을 사용할 수 있습니다.
-e: any kind of archive
-f: file
-h: symbolic link
-r: readable file
-w: writable file
-x: executable file
-s: file size greater than zero
[- d / home / ram / 디렉터리] # " 파일의 경우, 만약 [- f / home / rama/file] ". 그럼 에코 " dir present"; 다른 dir, 에코 " present" 없습니다. fi
ret = $? 만약 [" $ ret"; = " 0"; ] 그럼 에코 " dir present"; 다른 dir, 에코 " present" 없습니다. fi
위의 스크립트는 방관하겠나 dir 있는지 확인합니다.
이 경우 $? ',' 마지막 명령을 성공 " 되돌려줍니다 0". 다른 비사양 영의 값을. 예를 들어, '이미' 등 '다음' 트럼프디르 mkdir 트럼프디르 부여하느뇨 오류 (아래 참조).
>. mkdir: 디렉토리를 만들 수 없습니다 "트럼프디르": 파일이 존재합니다.
if [ -d "$DIRECTORY" ]; then
# Here if $DIRECTORY exists
fi
D 'test' 사용할 수 있습니다 (자세한 내용은 '양반이군요 테스트').
>. d '파일' 는 파일이 있으면 참 디렉터리입니다.
예를 들면 다음과 같습니다.
test -d "/etc" && echo Exists || echo Does not exist
참고: 이 같은 'test' 명령은 조건식 ' [' (참조: [') 에 걸쳐' 양반이군요 도왔으매 it& # 39 이동형이든지 쉘로 스크립트입니다.
>. ' [' - 이것은 동의어) 의 'test' 내장 있지만, 마지막 인수가 박스트롤의 ipv6-literal. 합니다 ']' 일치시킵니다 열기 ' ['.
가능한 옵션 또는 추가 도움말에서는 확인:
['-' 도움말에서는
(cd $dir) || return # is this a directory,
# and do we have access?
저는 보통 흐름 안에 기능:
can_use_as_dir() {
(cd ${1:?pathname expected}) || return
}
또는:
assert_dir_access() {
(cd ${1:?pathname expected}) || exit
}
이 훌륭한 외곽진입 대해서 생각해 볼 수 없는 것은 내가 좋은 오류 메시지.
'표준' cd 나 부여하느뇨 한 줄 메시지를 표준에러출력 상태다. 나보다 더 많은 정보를 제공할 수 있게 될 것입니다. Cd 안에 서브셸 수행하여 '' ' (. ) '이 명령은 현재 디렉터리이고 요청자에게 영향을 주지 않습니다. 이 경우 디렉토리가 서브셸 및 기능, 단 한 번의 op 없습니다.
다음은 주장을 저희에게는힘과 패스를 'cd': '$ {1}' 경로명입니다 걱정했던것.?. 이는 더 정교한 형태의 매개변수입니다 대체 원하는거요 아래에서 자세히 설명합니다.
Tl; dr: 이 기능을 사용할 경우, 우리는 다시 빈 문자열을 로 통과한 종료하십시오 서브셸 ' (. return) 함수) '와 함께 주어진 오류 메시지.
Ksh93 말을 인용해 '에서' 맨페이지:
${parameter:?word}
>. '다음' 는 그 값이 null 이 아닌 경우 매개변수입니다 대체하십시오 설정되어 있고, >. 그렇지 않으면 'word' 와 종료하십시오 쉘로 인쇄하십시오 않은 경우 대화형). >. 그 후 '단어' 가 생략된 경우 표준 메시지는 인쇄되었습니다.
및
>. ':' 는 생략할 경우, 그 위에서 표현식에서는 콜론 >. 쉘로 매개변수입니다 방관하겠나 설정되었습니다 미디어만을 있는지 확인합니다.
이 문서는 '라는 노래를 슬라이드에서는 다운스트림에서 쉘로 특유의' 라는 이름을 가진 사람은 다음이 있다 포함한 모든 합리적인 문자열이어야 공백.
이 예에서는, 내가 알고 있는 표준 오류 메시지 '1: 매개변수입니다 설정되어 있지 않은, 그래서 충분하나니 '가치' 를 확대 유형에 따라 우리가 여기 - 작성되지는 경로명입니다 '의 디렉터리입니다.
A 필로스필커 참고: 따라서 이 메시지는 객체 지향 언어, 셸 아닙니다 ',' 아니다 '' 디렉터리입니다 경로명입니다 밝혔습니다. Keep it simple, # 39 이 수준에서 I& 인수만 맞추기바인딩 존재하고 있는 것이 아니라 그냥 써줬지; d
하위 디렉터리 내 폴더의 존재 여부를 확인합니다:
found=`find -유형 d -이름 "myDirectory"`
if [ -n "$found"]
then
변수 'found'에는 'myDirectory'가 있는 전체 경로가 포함됩니다.
# '내 디렉터리'라는 이름의 폴더가 여러 개 있는 경우 여러 줄이 포함될 수 있습니다.
fi
현재 디렉토리 내의 패턴에 따라 하나 또는 여러 폴더의 존재를 확인합니다:
found=`find -maxdepth 1 -type d -name "my*"`
if [ -n "$found"]
then
변수 'found'는 'my*&39;폴더가 발견된 전체 경로를 포함합니다.
fi
두 조합 모두. 다음 예에서는 현재 디렉터리에 폴더가 있는지 확인합니다:
found=`find -maxdepth 1 -type d -name "myDirectory"`
if [ -n "$found"]
then
변수가 비어 있지 않습니다 = 'found' 'myDirectory&39;`가 존재합니다.
fi
사실 여러 가지 도구를 콩지름에 afaq 완벽한 외곽진입:
DIR_PATH=`readlink -f "${the_stuff_you_test}"` # Get rid of symlinks and get abs path
if [[ -d "${DIR_PATH}" ]] ; Then # now you're testing
echo "It's a dir";
fi
걱정할 필요가 없는 공백 및 특수 문자를 사용하여, $ {} " " as long as you ','.
참고로 '아닌' [], [[]] '는' 로 이동형이든지 때문에 많은 사람들이 작동합니까 현대 버전의 배시 (이후, 대부분의 사람들은 모든 t # 39, 심지어 don& 작동합니까 명령행을 p), 크면 문제가 될 수 있습니다.
Whatever you want to do 의 경우 보았느뇨 할 일을 한 '보다는' 전에 보았으매 leap?
즉, 스케쳐내 존재를 확인하기 위해 이 일을 시작하기 전에 시도하시겠습니까 디렉터리입니다 해버린다는거, 그냥.
if pushd /path/you/want/to/enter; then
# commands you want to run in this directory
popd
fi
이 경우, ll 들어갈 수 있는 경로를 제공하기 위해 ',' 푸시드 you& # 39 와 it& # 39, ll, 즉 '다음' 부분을 '0' 함께 종료됩니다. 기술서임을 실행됩니다. # 39 doesn& 존재할 경우, t, 아무런 일도 일어나지 않습니다 (이외의 일부 출력입니다 수밖에 없다고 디렉터리입니다 doesn& 도움됐네 부작용이 있을 때, 디버깅할 수 있는 가능성이 있는 애니웨이, t # 39).
이것보다 더 리피팅 교도관님도요 필요로 하는 것 같다.
if [ -d /path/you/want/to/enter ]; then
pushd /path/you/want/to/enter
# commands you want to run in this directory
popd
fi
Cd ',' mv, rm 수행됨 '같은 것입니다.', '' 상술합니다. # 39 의 경우, 해당 파일이 있을 때, 그들을 시험하노라 don& they& t # 39, ll 함께 종료됩니다. 오류가 발생하여 인쇄하려면 메시지가 있다고 말하면서, 자신의 '다음' t # 39 doesn& 존재하며, 블록 건너 뜁니다. 그들을 시험하노라 존재하지 않는 경우, 이 명령은 실행 파일에 대한 상태 '다음' 블록 '0' 과 함께 종료됩니다. 너회의 수 있도록 노력하고 있습니다.