首页 > 解决方案 > 如何从基本文件名中获取最后一个字符?

问题描述

我有一个简单的脚本来自动下载 Android 固件并对其进行解密。但是我需要使用正确的文件解密类型enc2enc4.

这是我最有可能编写的脚本:

#!/bin/bash

# Check update
samloader -m GT-I8190N -r BTU checkupdate

# Download
samloader -m GT-I8190N -r BTU download -v I8190NXXAMJ2/I8190NBTUAMJ1/I8190NXXAMJ2/I8190NXXAMJ2 -O .


# Decrypt
#
# THIS IS THE PROBLEM
samloader -m GT-I8190N -r BTU decrypt -v I8190NXXAMJ2/I8190NBTUAMJ1/I8190NXXAMJ2/I8190NXXAMJ2 **-V 2** -i GT-I8190N_BTU_1_20131118100230_9ae3yzkqmu_fac.zip.**enc2** -o GT-I8190N_BTU_1_20131118100230_9ae3yzkqmu_fac.zip

用 (** **) 看一下代码

解密的文件是*.enc2*.enc4我的问题是如何检测格式(2 或 4)?. 比如使用sed, orawk等​​。

如果enc2,那么我指定-V 2以及 enc4,-V 4

谢谢!如果您需要更多信息,请告诉我

脚本:https ://github.com/nlscc/samloader

标签: bash

解决方案


当您需要将扩展​​名与文件名隔离时,您可以使用bash 提供的带有子字符串删除的参数扩展。子字符串删除可以从字符串的左侧或右侧(开始或结束)修剪。他们是:

    ${var#pattern}      Strip shortest match of pattern from front of $var
    ${var##pattern}     Strip longest match of pattern from front of $var
    ${var%pattern}      Strip shortest match of pattern from back of $var
    ${var%%pattern}     Strip longest match of pattern from back of $var

因此,对于文件名,您可以将扩展名隔离为:

ext="${fname##*.}"

去除前面的所有字符fname,包括最后一个字符,'.'只留下保存在ext.

然后,您可以使用if..elif..else..fiorcase...esac语句根据扩展名提供正确的解密。例如,使用if,您可以执行以下操作:

if [ "$ext" = "enc2" ]; then
    ## samloader with -V 2 command
elif [ "$ext" = "enc4" ]; then
    ## samloader with -V 4 command
else
    printf "error: unmatched extension.\n" >&2
    exit 1
fi

或使用case您将使用的语句:

case "$ext" in
    "enc2" ) ## samloader with -V 2 command
            ;;
    "enc4" ) ## samloader with -V 4 command
            ;;
       *   )
            printf "error: unmatched extension.\n" >&2
            ;;
 esac

注意:您实际上不必在调用case语句之前首先将扩展名与文件名分开,因为您可以使用*enc2*enc4操作整个文件名。您可以使用类似的通配符if...,但我发现它更好地排除故障以显式提取扩展,然后专门对其进行操作 - 由您决定)

如果您想构建完整的命令来执行分配-V 2or -V 4,请参阅:BashFAQ #50,特别是5。我正在构建一个基于仅在运行时才知道的信息的命令

如果您还有其他问题,请告诉我。


推荐阅读