txt 파일의 각 줄에서 특정 작업을 수행하고 마지막으로 각 줄에 대한 출력 파일을 생성하는 CentOS 컴퓨터에서 실행되는 스크립트가 있습니다. 스크립트가 중지되었으며 다시 실행해야 하지만 출력 파일이 이미 생성된 파일 행을 반복하지 않는 옵션을 추가합니다. 어떻게 해야 하나요?
스크립트는 다음과 같습니다.
while IFS=READ -r file; do
dir1=${file: -5:1}
dir2=${file#*_*_}
protein=$dir2.pdb
pock=$file.pdb
output=$file.txt
cd $dir1
cd $dir2
/path/to/executable -ps -i $protein -gl $pock -o /path/to/$output
cd ..
cd ..
done < /path/to/input.txt
답변1
첫째, terdon이 주석에서 지적했듯이 IFS=
및 사이에 공백이 있어야 합니다 read
( read
명령은 소문자여야 함).
while IFS= read -r file; do
이제 실제 질문에 대해: 출력 파일이 이미 존재하는 경우 건너뛰는 것이 목표인 경우 이를 설정한 후 명령 전에 루프에 추가할 수 output
있습니다 cd
.
if [ -e "/path/to/$output" ]; then
continue # the output file already exists, so skip re-creating it
fi
이 continue
명령은 나머지 루프 반복을 건너뛰고 목록의 다음 줄/파일로 직접 이동합니다. 그런데, 경로에 변수 참조가 포함되어 있으므로 경로 주위에 큰따옴표를 넣었습니다. 변수 참조를 큰따옴표로 묶는 것은 거의 항상 좋은 생각입니다.
또한 가능하면 스크립트에서 이를 피하는 것이 좋습니다 cd
. 어떤 이유로든 실패하면 나머지 스크립트가 엉망이 되어 잘못된 디렉터리에서 실행됩니다. 가능하다면 명시적인 경로를 사용하세요.
/path/to/executable -ps -i "$dir1/$dir2/$protein" -gl "$dir1/$dir2/$pock" -o "/path/to/$output"
어떤 이유로 이것이 작동하지 않는 경우(예: 실행 파일의 작업 디렉터리는 실제로 파일이 있는 디렉터리여야 합니다), 최소한 cd
명령을 실행하고 실패할 경우 실행하거나 반환을 시도하지 마십시오 cd
. 일하다:
if ! cd "$dir1/$dir2"; then
echo "Error changing into $dir1/$dir2; we're going to have to skip this one." >&2
continue # skip ahead to the next line/file
fi
/path/to/executable -ps -i "$protein" -gl "$pock" -o "/path/to/$output"
if ! cd ../..; then
echo "Error getting back to main directory. Unable to continue" >&2
exit 1
fi
그런데,shellcheck.netcd
는 스크립트의 무결성을 확인하는 훌륭한 도구이며 따옴표가 없는 변수 참조 및 확인되지 않은 명령 오류 와 같은 일반적인 오류를 지적합니다 .