我想制作一个脚本来添加一些书籍或文件夹到calibredb,我想使用带有对话框的bash gui。 我是个新手,正在自学,所以代码可能很奇怪..
我的主菜单看起来像这样:
function main_menu(){
MENU=$(dialog --clear --title "Calibre" \
--backtitle "Add Books" \
--menu "What to do ?" \
0 0 0 "C" "Choose a book or a folder" "M" "Enter metadata infos" "L" "Add selected Book(s)" "D" "Change default Directory for books" "E" "Exit" \
2>&1 >/dev/tty)
if [ $MENU = "C" ];then
select=$(file_selector $mnt)
elif [ $MENU = "M" ];then
form_data
elif [ $MENU = "L" ];then
if [ -d $select ];then
add_folder $select
elif [ -f $select ];then
if [[ $file == *.cbz || $file == *.pdf ]]; then
add_book $select
else
error "Books should has extension .cbz .pdf"
fi
else
error "No file or folder selected"
fi
elif [ $MENU = "D" ];then
NEWDIR=$(file_selector $mnt)
elif [ $MENU = "E" ];then
exit
fi
}
当我输入 M 进入功能子菜单 form_data 时,它在启动时起作用,但如果我先进入其他子菜单则不起作用。我还使用了 if 语句而不是 case 因为我无法得到它,在启动时总是出错。 我的 form_data 函数是:
function form_data() {
auth=""
serie=""
tag=""
ind="1"
echo "form data"
exec 3>&1
IFS=$'\n'
VALUES=($(dialog --clear --ok-label "Submit" \
--backtitle "Calibre" \
--title "Manager" \
--form "Add a book" \
15 50 0 \
"Author's name:" 1 1 "$auth" 1 20 30 0 \
"Serie's name:" 2 1 "$serie" 2 20 30 0 \
"Tag:" 3 1 "$tag" 3 20 30 0 \
"Serie's index (int):" 4 1 "$ind" 4 20 30 0 \
2>&1 1>&3))
exec 3>&-
main_menu
}
如您所见,我在最后调用了 main_menu,因为我想在提交表单时返回到它。很不确定这就是这样做的方法。
还有很多信息对话框无法正常工作。
function error() {
dialog --clear --title "Error : " --msgbox $1 10 50
sleep 1
main_menu
}
最后的目标是调用 add_book 或 add_folder 函数来放入 calibre,我没有尝试,但我希望在对话框中显示进度条,但如果 calibredb 可以返回它的进度,我不会:
function add_folder() {
echo "add folder "
echo $1
echo ${VALUES[@]}
nbBooks=$(find $1 -maxdepth 1 -type f | wc -l);
listBooks=($(find $1 -maxdepth 1 -type f))
for (( i; i<=$nbBooks; i++ )); do
calibredb add -a "${VALUES[0]}" -s "${VALUES[1]}" -T "${VALUES[2]}" -S "$i" "${listBooks[$i]}" --with-library /home/gregory/books
done
main_menu
}
在经历了很多头痛之后,阅读文档,你们是我最后的希望来理解这个方法。 预先感谢。
不要使用递归来重复主菜单,使用顶级循环。
function main_menu(){
while :; do
MENU=$(dialog --clear --title "Calibre" \
--backtitle "Add Books" \
--menu "What to do ?" \
0 0 0 "C" "Choose a book or a folder" "M" "Enter metadata infos" "L" "Add selected Book(s)" "D" "Change default Directory for books" "E" "Exit" \
2>&1 >/dev/tty)
case "$MENU" in
C)
select=$(file_selector $mnt) ;;
M)
form_data ;;
L)
if [ -d "$select" ];then
add_folder "$select"
elif [ -f "$select" ];then
if [[ "$select" == *.cbz || "$select" == *.pdf ]]; then
add_book "$select"
else
error "Books should have extension .cbz or .pdf"
fi
else
error "No file or folder selected"
fi ;;
D)
NEWDIR=$(file_selector $mnt) ;;
E)
exit ;;
esac
done
}
那么你的其他函数应该简单地返回而不是调用
main_menu
。