변수가 비어 있거나 설정되지 않은 경우 [-d $ dirname]이 일치하는 이유는 무엇이며 이로 인해 홈 디렉토리의 내용이 삭제되는 이유는 무엇입니까?

아흐메드 모넴

이 코드가 있습니다.

dirname=

if [ -d $dirname ];
 then
 cd $dirname && rm *
fi

보시다시피이 빈 변수가 있습니다. 제가 알고 싶은 것은이 빈 변수와 같은 것을 단일 대괄호와 함께 사용할 때 모든 사용자의 홈 디렉토리 파일을 제거하는 이유입니다.

그리고 이중 대괄호를 사용하면 사용자의 홈 디렉토리 파일이 제거되지 않습니다.

이렇게

dirname=

if [[ -d $dirname ]];
 then
 cd $dirname && rm *
fi

단일 대괄호와 이중 대괄호를 모두 사용할 때 차이점 구문을 읽었습니다.

왜 이런 일이 발생하는지 알 수 있습니까?

존 문

cd인수를 전달되지 않습니다, 그것은 (대부분의 경우, 사용자의 홈 디렉토리를 기본 디렉토리로 변경됩니다 $HOME).

이 질문의 흥미로운 부분은 -dbash test또는 [내장 연산자 에게 아무것도 전달하지 않으면 bash가 0으로 종료되는 것처럼 보입니다 (제 생각에는 이것은 예상치 못한 것입니다).

dirname빈 변수로 설정하면 기본적으로 다음을 실행합니다.

if [ -d ]; then
    cd && rm *
fi

나에게는이 if블록 안의 코드 가 실행 된다는 것이 놀랍지 만 내 컴퓨터에서 그 코드 가 실행되었음을 확인할 수 있습니다. 위의 설명에서 설명 했듯이은 더 이상 연산자로 test해석하지 않으며 -dnull이 아닌 문자열이기 때문에 단순히 0을 반환합니다. 이러한 종류의 동작을 방지하는 한 가지 방법은 변수를 인용하는 것입니다.

if [ -d "$dirname" ]; then
    cd "$dirname" && rm *
fi

이 경우 $dirname비어 있으면 0이 아닌 종료 코드를 올바르게 평가하는 연산자에 전달 ""되어 -d블록 내부의 코드가 실행되지 않습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관