2014-03-24 2 views
3

디렉토리가 존재하고 액세스 권한이 있는지 확인하고 싶습니다. 그렇다면 작업을 수행하십시오. 이것은 내가 작성한 코드이며 적절한 구문이 없을 수 있습니다.디렉토리가 존재하고 액세스 가능한지 확인하십시오.

수정 해 주시겠습니까?

dir_test=/data/abc/xyz 
if (test -d $dir_test & test –x $dir_test -eq 0); 
then 
cd $dir_test 
fi 

나는 이것도 이와 같이 작성할 수 있다고 생각합니다.

dir_test=/data/abc/xyz 
test -d $dir_test 
if [ $? -eq 0 ]; 
then 
test –x $dir_test 
if [ $? -eq 0 ]; 
then 
cd $dir_test 
fi 
fi 

어떻게하면 더 효율적으로 작성할 수 있습니까?

+0

'['...']'은'test'의 동의어이므로'test' ** 쓸모없는 사용으로 분류합니다. ** ;-) 설명은 @chepner를 참조하십시오. –

+0

더 많은 예제와 설명은 다음과 같습니다 : [쉘 스크립트에 디렉토리가 있는지 확인하는 방법] (http://stackoverflow.com/questions/59838/how-to-check-if-a-directory-exists-in-a -shell-script) –

답변

10

은 원래 test 기반 솔루션은 테스트가 실패하고 당신이하지 디렉토리를 변경 할 경우에 당신이 무엇을 할 것 인 비록

if test -d "$dir_test" && test –x "$dir_test"; 
then 
    cd $dir_test 
fi 

될 작성하는 가장 좋은 방법은? 나머지 스크립트는 예상대로 작동하지 않을 것입니다.

if [ -d "$dir_test" ] && [ -x "$dir_test" ]; then 

하거나 bash에서 제공하는 조건부 명령을 사용할 수 있습니다 :

당신은 test[ 동의어를 사용하여이 단축 될 수 있습니다 당신이 가고 있기 때문에,

if [[ -d "$dir_test" && -x "$dir_test" ]]; then 

최상의 솔루션을 테스트가 성공하면 디렉토리를 변경하고 간단히 시도하고 시도하고 실패하면 중단합니다.

cd "$dir_test" || { 
    # Take the appropriate action; one option is to just exit with 
    # an error. 
    exit 1 
} 
+0

내가 이해할 수없는 부분은 "$ dir_test || {exit1}"명령문을 사용하면 디렉토리가 존재하고 액세스 가능한지 여부를 평가할 것입니까? –

+0

'cdman '이 성공하면'||'다음의 아무 것도 평가되지 않습니다. – chepner

+0

고마워요. –

0
if [ -d $dir_test -a -x $dir_test ] 

당신은/usr/빈/CD가 양자 택일 경우 : 디렉토리에 액세스 할 수있는 경우

if [ /usr/bin/cd $dir_test ] 
+1

POSIX 표준에서는'-a'연산자 대신'[-d $ dir_test] && [-x $ dir_test]'를 권장합니다. – chepner

1
dir_test=/data/abc/xyz 
if (test -d $dir_test & test –x $dir_test -eq 0); # This is wrong. The `-eq 0` part will result in `test: too many arguments`. The subshell (parens) is also unnecessary and expensive. 
then 
cd $dir_test 
fi 

cd 당신을 말할 수 있습니다. 당신이 어떤 이유로, test 처음 사용하기로 결정하더라도 그냥

cd "$dir_test" || exit 1; 

을, 당신이해야 여전히 체크 cd의 종료 상태, 당신은 경쟁 조건을 가지고 않도록.

관련 문제