又写脚本

脚本是三太爷比较犯憷的领域,每次要用都是应个急的差事,但是由于基本上从来没有专心研究过,所以基础也一直是半瓶子醋,不管是 shell 脚本,还是 VBScript/JavaScript,都是如此。

这几天又有个活儿,是要从安装包批量提取 Android 应用的信息。原本以为网上会有比较成熟的代码可供使用,结果找来找去都没有找到,甚至 Python 的都质量不高。于是只好自己硬着头皮上手。语言是 Bash Shell,结果在 Ubuntu 下测试通过后发现 macOS 执行有问题,又折腾了一番才搞定。将几条零碎的经验记录于此,以备后用。

1、函数参数。定义函数时毋须写明参数列表,在函数体内用 $1、$2、… $n 这样的形式引用;
2、函数返回不止一个信息。无法,返回的只能是一个整数;如果需要,就得用全局变量进行变通处理了;
3、使用数组。
定义数组:array=(val1 val2 val3)
定义元素:array[n]=val
读取元素:val=$(array[n])
所有元素:echo $(array[@])
元素个数:${#array[@]} 或者 ${#array[*]} 或者 ${#array}
删除元素:unset array[n]
4、echo 换行符。回显变量时,如果 echo $var 就会导致换行符丢失,echo “$var” 则正常,因为不加引号的话,会只显示分隔符(如换行符)切割后的第一部分;
5、如果在脚本中使用各个变量拼接命令,则每个变量都会被作为一个(而且是一整个)参数传入,即使是空串也会占用一个;
6、sed 的 -r 参数的功能,如果想要获得 POSIX 兼容性,可写作 -E;
7、alias 在非交互式的脚本中不会展开。如果非要达到效果,可以用函数来实现。如:
alias readlink=greadlink
readlink –help
可以实现为:
function my_readlink() {
greadlink “$@”
}
my_readlink –help
8、当字符串里存在转义字符时,Ubuntu 直接输出不了,需要给 echo 加 -e 的参数,但是到了 macOS 下,-e 也被作为字符串输出了;原因是没有在脚本最开始加入 #!/bin/bash 标识,而 echo 同时又是一个内部命令;
9、脚本中判断操作系统:

10、去除字符串首尾空白

用法:

其中上述第二行,可以写成 var=trim "$var",但是却不能写成 var=”$(trim ‘$var’)”。

11、tee 命令,就是个管道的旁路拦截器;
12、命令行里用 <<eof 表示即将接收标准输入,以 eof 串为结束标志,这个字串可以改变;
13、>| 是 > 的强制覆盖版本(与 set -C 和 set +C 命令有关);
14、shell 脚本支持从管道读取(testpipe.sh)

用法 cat a.txt | ./testpipe.sh

参考 http://www.tldp.org/LDP/abs/html/x17974.html

15、获取 apk 的应用图标
extract-apk-icon () { unzip -p $1 $(aapt d –values badging $1 | sed -n “/^application: /s/.*icon=’\([^’]*\).*/\1/p”) > /tmp/$$.png; }

这个方法有个缺陷,如果图标是自适应的 .xml 文件就不对了,应该继续查找 .png 的文件

16、生成一个 8 位的随机密码。
tr -dc A-Za-z0-9_ </dev/urandom | head -c 8 | xargs

发表评论

电子邮件地址不会被公开。 必填项已用*标注