-2

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

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

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

这是脚本:

#!/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

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

4

1 回答 1

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
于 2012-12-15T00:24:07.430 回答