출력이 이미 존재하는 경우 이 줄을 건너뛰십시오.

출력이 이미 존재하는 경우 이 줄을 건너뛰십시오.

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는 스크립트의 무결성을 확인하는 훌륭한 도구이며 따옴표가 없는 변수 참조 및 확인되지 않은 명령 오류 와 같은 일반적인 오류를 지적합니다 .

관련 정보