我使用腳本將所有 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 之間的數字。
在 shell 腳本中,特殊變數$?
包含最後一個指令的退出狀態。如果您需要多次使用它,請將其保存到另一個變數(否則使用它的第一個命令將設定$?
為其狀態)。
通常,您不需要使用$?
:您可以利用 shell 的條件構造對零和非零做出不同的反應。
if genisoimage …; then
rm rm -rf "$parent_path"
else
echo 1>&2 "genisoimage failed, aborting"
exit 2
fi
您可以使用set -e
將腳本切換到退出時出錯模式:如果簡單命令失敗(即返回非零狀態),腳本將立即退出,並具有相同的退出狀態。例如,如果您在循環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 表示“未找到”,其他值表示“發生了一些錯誤”。