이름에 숫자 범위가 증가하지만 연속적이지 않은 파일을 반복합니다.

이름에 숫자 범위가 증가하지만 연속적이지 않은 파일을 반복합니다.

파일 이름에는 다음 형식의 패턴이 포함되어 있으며 00035023030마지막 두 자리만 에서 로 ...30변경됩니다 . 그러나 say 와 같은 ...35숫자가 누락 되면 오류가 발생합니다. 이 오류를 우회하고 다음 명령 목록을 루프에서 실행하려면 어떻게 해야 합니까?303531

다음은 barycorr세 가지 입력을 요청하는 프로그램입니다.

  1. /home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl.evt
  2. /home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl_bary.evt
  3. /home/dinesh/Test/00035023032/auxil/sw00035023032sao.fits.gz

각 실행마다 생성하는 스크립트 파일은 다음과 같습니다.

echo -e "/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl.evt
/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023030/auxil/sw00035023030sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log

echo -e "/home/dinesh/Test/output00035023031/sw00035023031xwtw2po_cl.evt
/home/dinesh/Test/output00035023031/sw00035023031xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023031/auxil/sw00035023031sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log

echo -e "/home/dinesh/Test/output00035023032/sw00035023032xwtw2po_cl.evt
/home/dinesh/Test/output00035023032/sw00035023032xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023032/auxil/sw00035023032sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log

echo -e "/home/dinesh/Test/output00035023033/sw00035023033xwtw2po_cl.evt
/home/dinesh/Test/output00035023032/sw00035023033xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023032/auxil/sw00035023032sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log

답변1

스크립트는 중지되지 않고 모든 명령을 실행합니다. 당신이 해야 할 일은 오류를 무시하는 것 뿐입니다. 그러나 누락된 파일을 건너뛰도록 할 수 있는 기능이 있습니다. 예를 들어, 다음과 같이 스크립트를 다시 작성할 수 있습니다(중괄호 확장에서 0 패딩을 위해 bash 버전 4 이상을 가정).

#!/bin/bash

for num in {00035023030..00035023033}; do
    dir=/home/dinesh/Test/output"${num}"
    file1="$dir/sw${num}xwtw2po_cl.evt"
    file2="$dir/sw${num}xwtw2po_cl_bary.evt"
    file3="/home/dinesh/Test/$num/auxil/sw${num}sao.fits.gz"

    if [[ -e "$file1" && -e "$file2" && -e "$file3" ]]; then
        printf '%s %s %s' "$file1" "$file2" "$file3" | 
            barycorr ra=253.467570 dec=39.760169 &>>log
    else
        echo "Some files missing for $num" >> log
    fi
done

설명하다

  • for num in {00035023030..00035023033}; do: 이 {start..end}표기법을 "분기 확장"이라고 하며 start다음에서 까지의 모든 숫자 로 확장됩니다 end.

    $ echo {00035023030..00035023033}
    00035023030 00035023031 00035023032 00035023033
    

이것은 변수(이 경우)의 값을 각 "사물"에 설정하는 for variable in somethingfor 루프입니다 . $num이는 루프가 00035023030에서 0035023033까지의 숫자를 반복한다는 의미입니다.

  • 루프 내부에서는 긴 이름을 쓸 필요가 없도록 하고 모든 것을 깔끔하게 유지하기 위해 몇 가지 변수를 설정했습니다. 그래서 우리는:

     dir=/home/dinesh/Test/output"${num}"
     file1="$dir/sw${num}xwtw2po_cl.evt"
     file2="$dir/sw${num}xwtw2po_cl_bary.evt"
     file3="/home/dinesh/Test/$num/auxil/sw${num}sao.fits.gz"
    

    ${num}이는 쉘이 이와 같은 것을 이해하는 데 필요합니다. sw${num}xwtw2po_cl_bary.evt왜냐하면 sw$numxwtw2po_cl_bary.evt쉘은 변수의 이름이 무엇인지 알 수 있는 방법이 없기 $num때문입니다 $numxwtw2po_cl_bary.evt.

  • if [[ -e "$file1" && -e "$file2" && -e "$file3" ]]; then: if세 개의 파일이 모두 존재하는지 확인합니다. 파일이 존재하는지 확인 중입니다 -e. 따라서 if세 개의 파일이 모두 존재하는 경우에만 성공합니다.

관련 정보