파일 이름에는 다음 형식의 패턴이 포함되어 있으며 00035023030
마지막 두 자리만 에서 로 ...30
변경됩니다 . 그러나 say 와 같은 ...35
숫자가 누락 되면 오류가 발생합니다. 이 오류를 우회하고 다음 명령 목록을 루프에서 실행하려면 어떻게 해야 합니까?30
35
31
다음은 barycorr
세 가지 입력을 요청하는 프로그램입니다.
/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl.evt
/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl_bary.evt
/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 something
for 루프입니다 . $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
세 개의 파일이 모두 존재하는 경우에만 성공합니다.