나는 모든 VIDEO_TS 디렉토리를 .ISO로 변환하는 스크립트를 사용합니다. genisoimage가 실패하고 다음 폴더를 변환하는 대신 실제로 변환하는지 어떻게 확인합니까?
변환 후 폴더를 삭제하라는 명령이 있지만 genisoimage가 실패하면 여전히 삭제됩니다.
#!/bin/bash
iso_name=""
parent_path=""
full_path=""
total=0
IFS=$'\n'
clear
for file in $(find /shares/media/ -type d -name 'VIDEO_TS')
do
parent_path="$(dirname -- "$file")"
full_path="$file"
iso_name="$(basename -- "$parent_path").ISO"
iso_path=""$(dirname -- "$parent_path")"/"$iso_name""
echo "Converting to "$iso_name""
((total++))
genisoimage -allow-limited-size -o "$iso_path" -dvd-video "$parent_path"
rm -rf "$parent_path"
done
echo "Succesfully converted "$total" videos to ISO!"
답변1
모든 프로세스에는종료 상태, 0에서 255 사이의 숫자입니다. 거의 보편적으로 따르는 규칙이 있습니다. 0은 성공을 의미하고, 다른 값은 실패를 의미합니다.
쉘 스크립트에서 특수 변수에는 $?
마지막 명령의 종료 상태가 포함됩니다. 여러 번 사용해야 하는 경우 다른 변수에 저장하십시오. 그렇지 않으면 이를 사용하는 첫 번째 명령이 $?
해당 상태를 설정합니다.
일반적으로 그럴 필요는 없습니다 $?
. 쉘의 조건부 구성을 활용하여 0과 0이 아닌 것에 다르게 반응할 수 있습니다.
if genisoimage …; then
rm rm -rf "$parent_path"
else
echo 1>&2 "genisoimage failed, aborting"
exit 2
fi
종료 모드에서 스크립트를 오류로 전환하는 데 사용할 수 있습니다 set -e
. 간단한 명령이 실패하면(즉, 0이 아닌 상태를 반환하는 경우) 스크립트는 동일한 종료 상태로 즉시 종료됩니다. 예를 들어 루프 set -e
앞에 위치를 지정 하면 for
스크립트가 genisoimage
실패할 경우 즉시 종료됩니다.
루프를 계속 진행하고 실패를 기록하려면 현재 오류 수를 변수에 저장하세요.
successes=0
failures=0
err=0
for file in $(find /shares/media/ -type d -name 'VIDEO_TS')
do
parent_path="$(dirname -- "$file")" # or parent_path=${file%/*}
iso_path="$parent_path.ISO"
echo "Converting to "$iso_name""
genisoimage -allow-limited-size -o "$iso_path" -dvd-video "$parent_path"
ret=$?
if ((ret == 0)); then
rm -rf "$parent_path"
((++successes))
else
((++failures))
if ((ret > err)); then ret=$err; fi
fi
done
echo "Succesfully converted "$total" videos to ISO. There were $failures failures."
exit $err
1 검색 명령의 경우 grep
0은 "발견됨"을 의미하고, 1은 "찾을 수 없음"을 의미하며, 기타 값은 "일부 오류가 발생함"을 의미합니다.