Shell脚本下(8)

简介: 先看下要实现的效果

先看下要实现的效果


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 参数解析


find_api.sh


  1. shell对于我们的终端来说,像一个大的函数,后面通过空格来传参


  1. echo "$# -- $@" -> 打印一下看看传入的参数
  2. $1 -> 第一个参数


  1. $0 -> 默认是文件本身


  1. case的条件支持正则/通配符


  1. | -> 正则表达式
  2. 仔细看例子中条件 -> 这种写法就是长参数/短参数都识别的逻辑


  1. 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


  1. cat <<EOF -> 结束符 -> 输入相应的字符串结束标准输入的状态


  1. 结束符要顶格写
  2. 也可以用命令符来包括以下local help=$(cat <<EOF  EOF),不过建议使用第一种方法(顶格)


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 {} ;
  1. grep命令 -> 具体看文档


1. grep -E "Some|weak"
   1. grep 查找大小写敏感 -> -i 来声明一下就可以大胸写不敏感
   2. -E -> 正则表达式声明
   3. grep -E "Some|weak" ./mm.xcframework/test.m
  1. 核心命令展示


微信图片_20220510014341.png
命令融合


04 数组for循环与read


find_api数组for循环与read.sh


  1. : -> 占位符


微信图片_20220510014346.png
占位符


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


05 read与while read


find_api read与while read.sh


  1. 字符串里面有空格会出问题
  2. read -> 含义


  1. read -a
  2. <
  3. <<
  4. <<< 相应的含义查看注释


  1. 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 -> 扫码两边就可以解决


  1. 文件夹的名字有空格 -> 容易被空格分隔来当成多个参数 -> 用While read解决
  2. -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




目录
相关文章
|
22天前
|
Java Shell Linux
使用 sh -x 进行 shell 脚本调试
使用 sh -x 进行 shell 脚本调试
32 9
使用 sh -x 进行 shell 脚本调试
|
2天前
|
监控 关系型数据库 MySQL
优秀的网络工程师,早就偷偷收藏了这9 个实用 Shell 脚本!
优秀的网络工程师,早就偷偷收藏了这9 个实用 Shell 脚本!
|
12天前
|
存储 Shell 应用服务中间件
[ansible]wget批量调用shell脚本
[ansible]wget批量调用shell脚本
|
14天前
|
运维 监控 Shell
掌握100个开箱即用的Shell脚本~(附PDF)
Shell脚本是实现Linux系统管理及自动化运维所必备的重要工具。许多其它岗位的小伙伴也经常使用Shell脚本来实现某项需求。 今天分享《100个shell脚本案例》,共有55页,支持文字搜索定位,代码清晰可复制。
|
22天前
|
Shell 测试技术 Linux
Shell 脚本循环遍历日志文件中的值进行求和并计算平均值,最大值和最小值
Shell 脚本循环遍历日志文件中的值进行求和并计算平均值,最大值和最小值
29 3
|
1月前
|
JavaScript 前端开发 Shell
Shell 脚本编程保姆级教程(上)
Shell 脚本编程保姆级教程(上)
|
1月前
|
Shell Linux C语言
|
1月前
|
Shell 网络安全
shell脚本 配饰ssh
【7月更文挑战第15天】
23 4
|
1月前
|
网络协议 Shell Linux
Shell脚本配置Centos静态ip地址
这是一个用于在CentOS上设置静态IP的Shell脚本摘要: - 脚本交互式获取用户输入的IP地址、子网掩码、网关和DNS。 - 使用`sed`命令动态更新`/etc/sysconfig/network-scripts/ifcfg-ENS33`配置文件。 - 修改`BOOTPROTO`为`static`,并设置IP、NETMASK、GATEWAY和DNS1字段。 - 用`systemctl restart network`重启网络服务。 - 提示用户新配置的静态IP信息。
|
1月前
|
Shell Linux
Linux Shell 脚本入门教程:开启你的自动化之旅
Shell是一种计算机程序,它充当了用户与操作系统之间的接口。在Linux系统中,Shell允许用户通过命令行界面(CLI)来控制计算机。Shell脚本则是一种使用Shell语言编写的脚本,它可以自动执行一系列的命令,帮助用户实现任务自动化,提高工作效率。