bash - 如何从基本文件名中获取最后一个字符?
问题描述
我有一个简单的脚本来自动下载 Android 固件并对其进行解密。但是我需要使用正确的文件解密类型enc2
或enc4
.
这是我最有可能编写的脚本:
#!/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
谢谢!如果您需要更多信息,请告诉我
解决方案
当您需要将扩展名与文件名隔离时,您可以使用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..fi
orcase...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 2
or -V 4
,请参阅:BashFAQ #50,特别是5。我正在构建一个基于仅在运行时才知道的信息的命令
如果您还有其他问题,请告诉我。
推荐阅读
- javascript - 何时以及如何使用匿名函数
- excel - 将两个范围按行连接为一个
- jquery - 导航栏活动选项在加载页面后不会保持活动状态
- c - 在 Linux 上使用 C 语言调用 sysctl() 的示例
- git - 克隆存储库时突然添加工作树参数
- reactjs - 应该如何编写反应页面中的脚本标记以将其正确包含在 webpack 中?
- javascript - document.queryselectorall 不适用于多个类 javascript
- c# - 按 id 从数据库中加载行
- selenium-webdriver - 在 Jmeter 中停止 Selenium WebDrvier 测试
- android - android content provider方法是否需要同步?