先看下要实现的效果
1. sh find_api.sh -d ./mm.xcframework -s -f -lib --keyword "main" a. -d -> 路径 b. -s -> 搜索源码 c. -f -> 搜索framework d. -lib -> 搜索.dylib e. --keyword -> 代表要搜索的关键字, --开头,是代表长参数 ⅰ. -k -> 小参数 ⅱ. sh find_api.sh -d ./mm.xcframework -s -f -lib --keyword "main" -k "weak" -> 支持多关键字,长参数/短参数都支持
01 参数解析
- shell对于我们的终端来说,像一个大的函数,后面通过空格来传参
echo "$# -- $@"
-> 打印一下看看传入的参数- $1 -> 第一个参数
- $0 -> 默认是文件本身
- case的条件支持正则/通配符
- | -> 正则表达式
- 仔细看例子中条件 -> 这种写法就是长参数/短参数都识别的逻辑
- while -> 将所有参数循环拿到(注意while条件写法以及空格)
- -gt:大于
- shift命令可使参数向右发生位移,每次调用shift时,它将所有位置上的参数减一。
- *) -> 其他参数未识别
- exit 0 -> 正常退出
- exit 1 -> 代表发生的错误
02 -help输出与cat命令
- 正规的脚本,帮助信息很完善
- man echo
- find --help
- cat <<EOF -> 结束符 -> 输入相应的字符串结束标准输入的状态
- 结束符要顶格写
- 也可以用命令符来包括以下local help=$(cat <<EOF EOF),不过建议使用第一种方法(顶格)
03 find命令与grep命令
- find命令 -> 具体看文档
1. find ./mm.xcframework -name "*.framework" -> -name -> 要查找的指定内容 2. find ./mm.xcframework ( -name "*.framework" -o -name "*.o") 1. 第二个\是没有的,因为macdown语法 3. find ./mm.xcframework ( -name "*.framework" -o -name "*.o") -exec echo {} ;
- grep命令 -> 具体看文档
1. grep -E "Some|weak" 1. grep 查找大小写敏感 -> -i 来声明一下就可以大胸写不敏感 2. -E -> 正则表达式声明 3. grep -E "Some|weak" ./mm.xcframework/test.m
- 核心命令展示
命令融合
04 数组for循环与read
- : -> 占位符
占位符
- KEYWORK变量声明 -> 为了拿到所有传进来的key参数
05 read与while read
- 字符串里面有空格会出问题
- read -> 含义
- read -a
- <
- <<
- <<< 相应的含义查看注释
- while read
- 获取参数传到Find_Api里面之前, 字符串 + \n
- read是管道, 管道里面写的变量会出问题 -> 请看3
- 子Shell里面定义的变量, 父Shell是拿不到的
06 通配符扩展与find命令
- 首先记住一点, 不加引号的 * 首先会被bash进行扩展,所以 find . -name test* 在执行 find 命令前,bash先把 test* 替换成了 test1 test2 ... 然后 find 命令看到的参数实际上是 test1 test2 ..., 加了引号,bash就不去做替换了,那么 find 命令看到的参数就是 test*
- set -x -> 写在命令行前, 能打印出下一行执行的真正命令
- 又使用到了read来最终解决问题
- 进入了一个进退两难的底部, 加上"" -> '""' -> 会被认为是一个字符串
- 不加 -> 会提前被sh扩展替换
- eval -> 扫码两边就可以解决
- 文件夹的名字有空格 -> 容易被空格分隔来当成多个参数 -> 用While read解决
- -d -> 判断是否是一个目录
- $(basename "") -> 获取路径最后的参数
- "${name/.framework/ds}" -> 找到.framework之后用ds来替换
- 所以最终这样写 -> nm -pa ${name/.framework}" -> 因为找到的是name
nm -pa ${name/.framework}" | grep -E "$key_word"
-> -E 后面是正则- pushd/popd -> pushd/popd输出有干扰 -> > /dev/null ,重定位到一个黑洞
三个问题
- -k "weak" "cat" -> 一个关键字后面拼上多个参数
- 搜索组合比较繁琐, 怎么改进
- find -exec -> -exec 后面直接拼脚本 -> 来避免使用while read