解析含find、grep、awk的Linux脚本:请求详细解读
这段Linux脚本的完整执行逻辑解读
首先贴出完整脚本:
find . -name '*.nar' | while read NARFILE; do if jar tvf $NARFILE | grep -q jackson-databind; then OUTPUT=$(jar tvf $NARFILE | grep jackson-databind) echo $NARFILE':'$OUTPUT fi done | grep '\-2.9.10.jar' | awk -F':' '{print $1}' | while read NARFILE; do jar uvf $NARFILE META-INF/bundled-dependencies/jackson-databind-2.9.10.8.jar jar xvf $NARFILE META-INF/DEPENDENCIES sed -i '/jackson-databind/s/2.9.10$/2.9.10.8/' META-INF/DEPENDENCIES jar uvf $NARFILE META-INF/DEPENDENCIES zip -d $NARFILE META-INF/bundled-dependencies/jackson-databind-2.9.10.jar done
第一阶段:筛选出需要更新的.nar文件
这部分核心是定位内嵌了jackson-databind-2.9.10.jar的.nar文件:
find . -name '*.nar':遍历当前目录及所有子目录,找出所有后缀为.nar的文件(NAR是和JAR类似的Java生态打包格式)while read NARFILE:把找到的每个.nar文件路径逐个传给变量NARFILE,依次检查jar tvf $NARFILE | grep -q jackson-databind:用jar tvf列出当前.nar文件内的所有条目,通过grep -q静默检查是否包含jackson-databind相关文件(-q只返回匹配状态,不输出内容)- 如果检查到包含,就执行
OUTPUT=$(jar tvf $NARFILE | grep jackson-databind):把匹配到的jackson-databind相关条目存入变量OUTPUT,然后输出文件名:匹配条目的格式(比如demo.nar:META-INF/bundled-dependencies/jackson-databind-2.9.10.jar) grep '\-2.9.10.jar':从前面的输出里筛选出带-2.9.10.jar的行,定位到内嵌旧版本Jackson的.nar文件awk -F':' '{print $1}':以冒号为分隔符,提取每行的第一个部分(即.nar文件路径),得到最终需要处理的文件列表
第二阶段:更新.nar文件中的Jackson依赖版本
这部分是对筛选出的.nar文件进行版本升级,把旧的2.9.10版本替换为2.9.10.8:
jar uvf $NARFILE META-INF/bundled-dependencies/jackson-databind-2.9.10.8.jar:用jar uvf把本地的jackson-databind-2.9.10.8.jar添加到目标.nar文件的指定路径下(u代表更新/添加文件,v显示操作详情,f指定要操作的归档文件)jar xvf $NARFILE META-INF/DEPENDENCIES:从.nar文件里解压出META-INF/DEPENDENCIES文件到当前工作目录(x是解压操作)sed -i '/jackson-databind/s/2.9.10$/2.9.10.8/' META-INF/DEPENDENCIES:用sed修改解压后的DEPENDENCIES文件——找到包含jackson-databind的行,把行尾的2.9.10替换成2.9.10.8(-i表示直接修改文件内容,无需临时文件)jar uvf $NARFILE META-INF/DEPENDENCIES:把修改后的DEPENDENCIES文件重新添加回.nar文件,覆盖原文件zip -d $NARFILE META-INF/bundled-dependencies/jackson-databind-2.9.10.jar:因为.nar本质是ZIP格式,用zip命令删除文件里旧版本的jackson-databind-2.9.10.jar(-d是删除归档内指定文件的参数)
内容的提问来源于stack exchange,提问作者Mandroid
相关产品推荐
相关产品推荐

