shell脚本尝试及涉及语法

场景

查找cpp文件被哪个动态库编译了。
问题环境:

  • 根目录下cmake文件夹下有多个动态库的cmake文件。
    cmake文件包含的路径格式可能是srcdeep\srcdeep2:testfile1|testfile3或者srcdeep\srcdeep2\testfile1
  • 待查找的cpp文件在src路径下某个文件目录下,文件路径为相对路径。
    思路:
    通过cpp文件所在相对路径是否被动态库的config.cmake包含来确定是否被编译。
    输入:
    cpp文件相对路径
    方法:
    将相对路径AAA/BBB/CCC拼接为(\bAAA\b).*(\bBBB\b).*(\bCCC\b)的正则表达式,
    在通过find、grep、awk命令进行搜索。
    输出:
    被编译的动态库所属模块名称
    代码:
#!/bin/sh
# 填root目录,最后不要有/
rootpath="D:/CompileCheck"

echo "input search file path"
#srcdeep/srcdeep2/testfile1
#src/testfile1
flag="/"
while :; do #循环接受输入
  read filepath
  if [ -z $filepath ];then #判断用户是否输入
  echo "no input"
  continue
  fi
  arg=""
  #逐个截取/ /之间的内容填成正则表达式
  while [[ $filepath =~ $flag ]]; do
    tmp=${filepath%%/*}
#    echo "tmp is $tmp"
    arg=$arg"(\b"$tmp"\b)".*
    filepath=${filepath#*/}
#    echo "filepath is $filepath"
  done
  #正则表达式
  arg=$arg"(\b"$filepath"\b)"
#    echo "arg is $arg"
  #查找名字为config.cmake的文件里面包含filepath的文件,并打印其cmake下的目录
  find $rootpath/ -name config.cmake | xargs grep -E "$arg" | awk -F "/" '!a[$4]++{print $4}'
  echo "——————————————————————————————————————"
  echo "input search file path"
done

文件结构


shell脚本知识

  • while循环
while xxx; do
	xxx
  done
  • 判断字符串是否相等
    取反判断二进制是否相等
$filepath =~ $flag
  • 字符串拼接
arg=$arg"(\b"$tmp"\b)".*
  • linux命令行管道
    前一个命令的结果作为后一个命令的输入,一种是xargs,一种是exec
find $rootpath/ -name config.cmake | xargs grep -E "$arg" 
  • grep的正则表达式
    正则表达式通用,但要注意转义符号,如果是python可以直接r“正则表达式”(表示不需要使用转义,使用字符字面的意思)正则练习验证网站regex
grep -E "$arg"
  • awk分割和去重
    -F “分隔符” 按分隔符分割内容。去重使用了数组,定义一个数组a[],元素为$列,当$出现一次后就++,且判断数组的这个元素是不是0,如果出现了至少一次,则数组远程不是0。{print $4}表示前面的表达式满足后则打印第4列的值。这里第4列对应的是cmake的模块目录名。
awk -F "/" '!a[$4]++{print $4}'
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值