![이름에 증가하지만 연속되지 않은 숫자 범위가 있는 파일을 반복합니다.](https://rvso.com/image/192250/%EC%9D%B4%EB%A6%84%EC%97%90%20%EC%A6%9D%EA%B0%80%ED%95%98%EC%A7%80%EB%A7%8C%20%EC%97%B0%EC%86%8D%EB%90%98%EC%A7%80%20%EC%95%8A%EC%9D%80%20%EC%88%AB%EC%9E%90%20%EB%B2%94%EC%9C%84%EA%B0%80%20%EC%9E%88%EB%8A%94%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EB%B0%98%EB%B3%B5%ED%95%A9%EB%8B%88%EB%8B%A4..png)
파일 이름에는 마지막 두 자리 에서 으로 00035023030
만 변경되는 형식의 패턴이 포함되어 있습니다 . 그러나 하나의 숫자가 like 형태 로 누락되면 오류가 발생합니다. 이 오류를 우회하고 아래 명령 목록을 루프에서 실행하는 방법은 무엇입니까?...30
...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
스크립트는 중지되지 않고 모든 명령을 실행합니다. 당신이 해야 할 일은 오류를 무시하는 것 뿐입니다. 그러나 실제로 누락된 파일을 건너뛰도록 만들 수 있습니다. 예를 들어 다음과 같이 스크립트를 다시 작성할 수 있습니다(중괄호 확장의 제로 패딩에 대해 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
세 개의 파일이 모두 존재하는 경우에만 성공합니다.