SHELL

    plist文件-在脚本中的操作

    背景是写一个自动签名的脚本, 真的是从0到1的踩坑记, 其中需要对.provision文件进行签名信息截取, 并生成.plist文件

    method_ONE

    内容截取并保存临时文件中

    先看看.provision文字长什么样子, 我截取了其中一部分展示的信息,其中我们要的内容是从dict到dict之间

    security cms -D -i ./original.mobileprovision | grep --after-context=20 "Entitlements"  > /tmp/tmp_provision
    

    读取匹配的信息,并保存到/tmp/tmp_provision这个文件中

    python进行正则匹配,过滤dict之后的内容

    provision=`python -c "from re import findall,compile,S;data=open('/tmp/tmp_provision','r').read();print findall(compile(r'.*',S),data)[0];"`
    

    最后重定向到一个.plist文件中

    echo ''$provision'' > Entitlements.plist
    

    这个方法虽然可以, 但是其中第三部, 必须要格外注意字符的使用, 不然就格式不对,导致重定向出来的无法识别为.plist

    method_TWO

    重定向为一个.plist

    security cms -D -i ./original.mobileprovision > ProvisionProfile.plist
    

    查看到全部的信息, 重定向为一个ProvisionProfile.plist,还没有过滤

    提取内容生成

    /usr/libexec/PlistBuddy -x -c "Print Entitlements" ProvisionProfile.plist > Entitlements.plist
    

    直接将里面的子项Entitlements拿出来,生成一个新的Entitlements.plist

    这个方法比上面的稳妥不知道多少倍, 但是第一个的方法是自己钻研

    .plist文件的增删改查

    plutil -p ./ProvisionProfile.plist  #查看
    plutil -insert Insert -string "insert data here" ./ProvisionProfile.plist    #增
    plutil -replace Insert -string "change  data here" ./ProvisionProfile.plist  #替换
    

    列举的就诸如此类,plutil是一个.plist官方推荐的好工具

    Nov 14, 2017
    Unix

    shell脚本中如何捕获异常

    在高级语言的时候,我们可以使用捕获异常的语句, 进行catch, 并和谐的处理, 但是shell是没有类似keyword的, 如何解决?
    答案是 #? : 用于捕获上一条命令的状态,0的状态为正常,1为异常
    自己在整理shell的时候遇到一些坑, 把它的规范列一下

    #?和echo输出命令要注意


    这是一条echo输出命令,命令处于``之中,输出后执行. 但是命令是错误,执行的话会抛错误,也就是echo $?应该给到是1
    但是看看执行结果:

    看到输出的结果是0, 原因在于echo上, echo包了这一层命令, 只要echo直接将这命令打印在终端, 就是完整的完成工作,根本没有异常可言.

    修复

    当然是去除echo直接输出, 但是还是要注意的是, $?仅仅提示是上一条,这里必须十分谨慎.列下能捕获到异常:


    可以看到输出是1了, 确认命令使用没问题后,就可以进行逻辑处理.

    避免

    这是完整的逻辑代码:

    更好的避免, 将允许的条件, 并到逻辑与:

    [shell大法好]

    Nov 14, 2017
    Unix