Shell脚本下(8)

先看下要实现的效果

  1. sh find_api.sh -d ./mm.xcframework -s -f -lib --keyword "main"
    1. -d -> 路径
    2. -s -> 搜索源码
    3. -f -> 搜索framework
    4. -lib -> 搜索.dylib
    5. --keyword -> 代表要搜索的关键字, --开头,是代表长参数
      1. -k -> 小参数
      2. sh find_api.sh -d ./mm.xcframework -s -f -lib --keyword "main" -k "weak" -> 支持多关键字,长参数/短参数都支持

01 参数解析

find_api.sh

  1. shell对于我们的终端来说,像一个大的函数,后面通过空格来传参
    1. echo "$# -- $@" -> 打印一下看看传入的参数
    2. $1 -> 第一个参数
      1. $0 -> 默认是文件本身
    3. case的条件支持正则/通配符
      1. | -> 正则表达式
      2. 仔细看例子中条件 -> 这种写法就是长参数/短参数都识别的逻辑
    4. while -> 将所有参数循环拿到(注意while条件写法以及空格)
      1. -gt:大于
      2. shift命令可使参数向右发生位移,每次调用shift时,它将所有位置上的参数减一。
      3. *) -> 其他参数未识别
        1. exit 0 -> 正常退出
        2. exit 1 -> 代表发生的错误

02 -help输出与cat命令

find_api_help输出与cat命令.sh

  1. 正规的脚本,帮助信息很完善
    1. man echo
    2. find --help
  2. cat < 结束符 -> 输入相应的字符串结束标准输入的状态
    1. 结束符要顶格写
    2. 也可以用命令符来包括以下local help=$(cat <

03 find命令与grep命令

find_api命令与grep命令.sh

  1. 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 {} ;
  2. grep命令 -> 具体看文档
    1. grep -E "Some|weak"
      1. grep 查找大小写敏感 -> -i 来声明一下就可以大胸写不敏感
      2. -E -> 正则表达式声明
      3. grep -E "Some|weak" ./mm.xcframework/test.m
  3. 核心命令展示
    命令融合

04 数组for循环与read

find_api数组for循环与read.sh

  1. : -> 占位符
    占位符
  2. KEYWORK变量声明 -> 为了拿到所有传进来的key参数

05 read与while read

find_api read与while read.sh

  1. 字符串里面有空格会出问题
  2. read -> 含义
    1. read -a
    2. <
    3. <<
    4. <<< 相应的含义查看注释
  3. while read
    1. 获取参数传到Find_Api里面之前, 字符串 + \n
    2. read是管道, 管道里面写的变量会出问题 -> 请看3
    3. 子Shell里面定义的变量, 父Shell是拿不到的

06 通配符扩展与find命令

find_api通配符扩展与find命令.sh

  1. 首先记住一点, 不加引号的 * 首先会被bash进行扩展,所以 find . -name test* 在执行 find 命令前,bash先把 test* 替换成了 test1 test2 ... 然后 find 命令看到的参数实际上是 test1 test2 ..., 加了引号,bash就不去做替换了,那么 find 命令看到的参数就是 test*
  2. set -x -> 写在命令行前, 能打印出下一行执行的真正命令
  3. 又使用到了read来最终解决问题
  4. 进入了一个进退两难的底部, 加上"" -> '""' -> 会被认为是一个字符串
    1. 不加 -> 会提前被sh扩展替换
    2. eval -> 扫码两边就可以解决
  5. 文件夹的名字有空格 -> 容易被空格分隔来当成多个参数 -> 用While read解决
  6. -d -> 判断是否是一个目录
    1. $(basename "") -> 获取路径最后的参数
    2. "${name/.framework/ds}" -> 找到.framework之后用ds来替换
    3. 所以最终这样写 -> nm -pa ${name/.framework}" -> 因为找到的是name
    4. nm -pa ${name/.framework}" | grep -E "$key_word" -> -E 后面是正则
    5. pushd/popd -> pushd/popd输出有干扰 -> > /dev/null ,重定位到一个黑洞

三个问题

  1. -k "weak" "cat" -> 一个关键字后面拼上多个参数
  2. 搜索组合比较繁琐, 怎么改进
  3. find -exec -> -exec 后面直接拼脚本 -> 来避免使用while read

你可能感兴趣的:(Shell脚本下(8))