내 솔루션 권장 사항의 배경은 첫 번째 작업의 두 번째 주에 빌드 서버 청소의 절반을 닦은 친구의 이야기입니다. 기본 작업은 파일이 존재하는지 확인하고 존재하는 경우 삭제하는 것입니다. 그러나이 강에는 몇 가지 위험한 급류가 있습니다.
모든 것이 파일입니다.
스크립트는 일반적인 작업을 해결할 때만 강력한 힘을 발휘합니다
일반적으로 변수를 사용합니다
우리는 종종 수동 개입을 피하기 위해 스크립트에서 -f force를 사용합니다.
또한 적시에 우리가 만들고, 복사하고, 파괴 할 수 있도록 재귀를 사랑합니다.
다음 시나리오를 고려하십시오.
삭제하려는 파일이 있습니다 : filesexists.json
이 파일 이름은 변수에 저장됩니다
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
우리는 또한 일을 정말 유연하게하기 위해 경로 변수를 가지고 있습니다
<host>:~/Documents/thisfolderexists pathtofile=".."
<host>:~/Documents/thisfolderexists ls $pathtofile
filesexists.json history20170728 SE-Data-API.pem thisfolderexists
따라서 -e
예상대로 작동하는지 봅시다 . 파일이 존재합니까?
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
그렇습니다. 마법.
그러나 파일 변수가 실수로 nuffin으로 평가되면 어떻게 될까요?
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
뭐? 그것은 오류와 함께 반환되어야합니다 ... 그리고 이것은 우연히 전체 폴더가 삭제 된 이야기의 시작입니다.
대안은 우리가 '파일'로 이해하는 것을 구체적으로 테스트하는 것일 수 있습니다.
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
0
그래서 파일이 존재합니다 ...
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
1
그래서 이것은 파일이 아니며 아마도 전체 디렉토리를 삭제하고 싶지 않을 것입니다
man test
다음과 같이 말합니다.
-b FILE
FILE exists and is block special
-c FILE
FILE exists and is character special
-d FILE
FILE exists and is a directory
-e FILE
FILE exists
-f FILE
FILE exists and is a regular file
...
-h FILE
FILE exists and is a symbolic link (same as -L)