"goodbye"라는 파일이 현재 디렉터리에 있는지 테스트하고 해당 파일이 현재 디렉터리에 있으면 "I am here"를 인쇄하는 "test.sh" 스크립트를 작성하세요.
사전 설명 없이 "단어 문서"에서 이 문제가 발생했습니다. 이것이 제가 발생한 문제입니다. test.sh를 사용하여 작별 인사 파일이 현재 디렉토리에 있는지, 파일이 다음과 같은지 확인하는 스크립트를 작성해야 한다고 생각했습니다. 거기에 "I'm here"가 인쇄되어야 합니다. 하지만 test.sh를 사용하는 방법을 모르겠습니다.
내가 수행한 코드는 아직 확실하지 않습니다.
cisco@ubuntu:~$ > goodbye
if [ -f goodbye ]; then
echo "I am here"
fi
답변1
질문은 생각보다 쉽지 않습니다. 먼저 의미하는 바를 정의해야 하기 때문입니다.문서그리고존재하다.
- 그것은 디렉토리, fifo, 심볼릭 링크, 장치입니다.문서.
-f
유틸리티의 연산자는[
true만 반환합니다.일반 파일또는 궁극적으로 다음으로 해결되는 심볼릭 링크를 결정할 수 있습니다.일반 파일그리고 위의 내용은 모두 제외됩니다. lstat()
존재를 선언하기에 충분할 만큼 디렉터리에서 해당 이름을 가진 디렉터리 항목을 찾고 있습니까? 아니면 파일에 액세스할 수 있어야 합니까 (경로가 실제 파일로 확인되는지 확인) 또는stat()
(경로가 이후 실제 경로로 확인되는지 확인) 심볼릭 링크 해결).
그렇다면 현재 디렉터리를 읽을 수 없거나 검색할 수 없으면 어떻게 될까요? 파일이 존재하지 않는다고 거짓으로 진술하는 대신 이를 오류로 처리하고 중단해야 합니까?
if [ -f file ]; then
echo I am here
fi
file
"I am here" 는 심볼릭 링크 확인 후 일반 파일로 성공적으로 식별될 수 있으면 출력됩니다. file
존재하지 않거나 파일이 일반 파일이 아닌 경우(symlink 확인 후 결정됨) "I am here"는 출력되지 않습니다. , 또는 어떤 이유로 파일 형식을 확인할 수 없습니다. 현재 작업 디렉터리에 대한 검색 액세스가 필요하지만 읽기 액세스는 필요하지 않습니다.
if [ -e file ]; then
echo I am here
fi
파일이 모든 유형일 수 있다는 점을 제외하면 동일합니다. 위에서 언급한 대로 "여기 있습니다"가 file
확인할 수 없는 심볼릭 링크인 경우(링크가 끊어졌거나 사용자가 액세스 권한이 없는 영역을 가리키기 때문에) 출력이 없습니다.
if [ -e file ] || [ -L file ]; then
echo I am here
fi
file
동일하지만 깨진 기호 링크의 경우도 포함됩니다.
현재 작업 디렉터리를 검색할 수 없으면 거짓 긍정이 발생할 수 있습니다. 디렉터리를 입력한 이후 디렉터리의 권한이 변경되었거나 프로세스 자격 증명이 변경된 경우 cd
이런 일이 발생할 수 있습니다 .
사용:
if ls -d file > /dev/null; then
echo I am here
fi
동일한 작업을 수행 [ -e file ] || [ -L file ]
하고 파일을 찾을 수 없는 이유를 설명하는 오류가 표시됩니다.
zsh
셸 에서는 $ERRNO
특수 변수를 사용하여 원인을 찾을 수도 있습니다.
현재 디렉터리에 대한 검색 권한은 없지만 읽기 권한이 있고 전체 경로를 알고 있는 경우에도 해당 file
디렉터리에 파일 항목이 있는지 확인할 수 있습니다(예: bash와 같은 POSIX 셸 가정).
set -- "$PWD"/[f]ile
case $1 in
(*/file) echo "I am here"
esac
$PWD
( 현재 작업 디렉터리에 대한 경로가 일치할 수 없는 극단적인 경우가 있을 수 있으며 이로 인해 잘못된 긍정이 발생할 수 있습니다.)
바라보다이것은 stackoverflow에 대한 비슷한 질문과 답변에 대한 나의 답변입니다.더 많은 정보를 알고 싶습니다.
답변2
#!/bin/bash
[ -f goodbye ] && echo "I am here"