Bash脚本需要清理

时间:2012-12-13 18:29:59

标签: bash menu option

我有一个用于处理Android文件的脚本。我从其他地方借了很多代码并把它放在一起,现在差不多完成了。

该脚本在(至少)两件事中有错误:

  1. 当用户选择不可用的选项时,我希望它显示“无效选择”消息,然后返回选择屏幕。
  2. 是否我在选定的文件上运行操作,如果我返回主菜单(一个名为“build”的“主”脚本)并返回到此脚本,文件列表会以某种方式继续文件的编号从最后一次..即第一轮中的最后一个文件是#43。当我再次运行脚本时,第一个文件以#44开头。我必须完全退出master(build)脚本并重新开始
  3. 这是脚本:

    #!/bin/bash
    
    HOME=/home/dan/buildtool
    
    d=$HOME/apk_in/decompiled
    clear
    
    a=`ls -d $d/* | grep .apk`
    if [[ "$?" == "0" ]] ; then
        echo "Available apks for Recompiling: "
        echo
        cd $d
        for apkName in `ls | grep .apk`
        do
            i=$(($i+1))
            apkArray[$i]=$apkName
            echo "  $i. $apkName" >> temp.list
        done
        cat temp.list
        rm -f temp.list
        echo
        echo -n "Choose Apk number (choose x to return to menu): "
        read ans
        echo
    
        if [ "$ans" == "" ]; then
            echo "Invalid choice"
            echo
            exit 0
        fi  
        if [ "$ans" == "x" ]; then
            clear           
            . $HOME/build
        fi
        if [ "`echo $ans | sed 's/[0-9]*//'`" == "" ] || [ "ans"=="1" ]; then
            apkDecode=${apkArray[$ans]}
            if [ "$apkDecode" == "" ]; then
                exit 0
            fi
        else
            exit 0
        fi  
        apktool b -f $apkDecode 
    
    else
        echo
        clear
        echo "No valid files"
    fi
    

    理想情况下,我希望能够选择多个文件来处理,但我想这将是对脚本的完整重写。 首先,我想清理一下这个:)

1 个答案:

答案 0 :(得分:1)

通常,您不希望将ls的输出用于任何内容,尤其是在简单的glob可以替换它时。 Bash已经有一个按项目选择的菜单:select语句。

你也遇到了[“ans”==“1”]的陷阱,这总是正确的。您可能意味着[[$ ans == 1]](ShellCheck有时会对这些问题有所帮助)。

基于此,这是重写的起点:

#!/bin/bash
HOME=/home/dan/buildtool
d=$HOME/apk_in/decompiled
shopt -s failglob
echo "Enter a number, or x to exit"
select file in *.apk
do
    [[ $REPLY == x ]] && break
    [[ -z $file ]] && echo "Invalid choice" && continue
    apktool b -f "$file"
done