先看下要实现的效果
- sh find_api.sh -d ./mm.xcframework -s -f -lib --keyword "main"
- -d -> 路径
- -s -> 搜索源码
- -f -> 搜索framework
- -lib -> 搜索.dylib
- --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命令 -> 具体看文档
- find ./mm.xcframework -name "*.framework" -> -name -> 要查找的指定内容
- find ./mm.xcframework ( -name "*.framework" -o -name "*.o")
- 第二个\是没有的,因为macdown语法
- find ./mm.xcframework ( -name "*.framework" -o -name "*.o") -exec echo {} ;
- grep命令 -> 具体看文档
- grep -E "Some|weak"
- grep 查找大小写敏感 -> -i 来声明一下就可以大胸写不敏感
- -E -> 正则表达式声明
- grep -E "Some|weak" ./mm.xcframework/test.m
- grep -E "Some|weak"
-
核心命令展示
命令融合
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
网友评论