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

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

파일 이름에는 마지막 두 자리 에서 으로 00035023030만 변경되는 형식의 패턴이 포함되어 있습니다 . 그러나 하나의 숫자가 like 형태 로 누락되면 오류가 발생합니다. 이 오류를 우회하고 아래 명령 목록을 루프에서 실행하는 방법은 무엇입니까?...30...35303531

다음은 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

스크립트는 중지되지 않고 모든 명령을 실행합니다. 당신이 해야 할 일은 오류를 무시하는 것 뿐입니다. 그러나 실제로 누락된 파일을 건너뛰도록 만들 수 있습니다. 예를 들어 다음과 같이 스크립트를 다시 작성할 수 있습니다(중괄호 확장의 제로 패딩에 대해 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세 개의 파일이 모두 존재하는 경우에만 성공합니다.

관련 정보