码迷,mamicode.com
首页 > Web开发 > 详细

Shell工具:jsondiff.sh

时间:2015-07-02 06:31:29      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

逻辑很简单,无非就是通过curl在不同的服务器上取得结果集,然后diff即可,不过这里有几点需要注意的地方:首先,JSON就一行,直接 diff会失去意义;其次,JSON中汉字会被编码,不利于查看;另外,JSON中字段顺序是无所谓的,所以diff前最好排序。说明一下,在格式化 JSON数据的时候,我没有用Bash,而是用的PHP:

  1. #!/bin/bash 
  2. RM=/bin/rm 
  3. PHP=/usr/bin/php 
  4. CURL=/usr/bin/curl 
  5. DIFF=/usr/bin/diff 
  6. VIMDIFF=/usr/bin/vimdiff 
  7. COLORDIFF=/usr/bin/colordiff 
  8. usage() { 
  9.     echo "Usage: $0 --uri=<URI> --old=<IP> --new=<IP>" 
  10. } 
  11. format() { 
  12.     $PHP -R ‘ 
  13.         function ksort_recursive(&$array) { 
  14.             if (!is_array($array)) { 
  15.                 return; 
  16.             } 
  17.             ksort($array); 
  18.  
  19.             foreach (array_keys($array) as $key) { 
  20.                 ksort_recursive($array[$key]); 
  21.             } 
  22.         } 
  23.         $options = JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE; 
  24.  
  25.         $array = json_decode($argn, true); 
  26.         ksort_recursive($array); 
  27.  
  28.         echo json_encode($array, $options); 
  29.     ‘ 
  30. } 
  31. request() { 
  32.     $CURL -s -H "Host: $1" "http://$2$3" 
  33. } 
  34.  
  35. eval set -- $( 
  36.     getopt -q -o "h" -l "host:,uri:,old:,new:,vim,help" -- "$@" 
  37. ) 
  38. while true; do 
  39.     case "$1" in 
  40.         --host)    HOST=$2; shift 2;; 
  41.         --uri)     URI=$2;  shift 2;; 
  42.         --old)     OLD=$2;  shift 2;; 
  43.         --new)     NEW=$2;  shift 2;; 
  44.         --vim)     VIM="Y"; shift 1;; 
  45.         -h|--help) usage;   exit 0;; 
  46.         --)                 break;; 
  47.     esac 
  48. done 
  49. if [[ -z "$URI" || -z "$OLD" || -z "$NEW" ]]; then 
  50.     usage 
  51.     exit 1 
  52. fi 
  53. if [[ -z "$HOST" ]]; then 
  54.     HOST="www.foobar.com" 
  55. fi 
  56. OLD_FILE=$(mktemp) 
  57. NEW_FILE=$(mktemp) 
  58. request "$HOST" "$OLD" "$URI" | format > $OLD_FILE 
  59. request "$HOST" "$NEW" "$URI" | format > $NEW_FILE 
  60. if [[ "$VIM" == "Y" ]]; then 
  61.     $VIMDIFF $OLD_FILE $NEW_FILE 
  62. elif [[ -x "$COLORDIFF" ]]; then 
  63.     $COLORDIFF -u $OLD_FILE $NEW_FILE 
  64. else 
  65.     $DIFF -u $OLD_FILE $NEW_FILE 
  66. fi 
  67. $RM -f $OLD_FILE 
  68. $RM -f $NEW_FILE 

其中「getopt」的用法值得注意一下,相关参考资料如下:

  1. Getopt in Bash 
  2. Bash: Preserving Whitespace Using set and eval 

虽然我的Shell水平有限,但是我尽可能写得易用:在diff的时候,允许使用多种工具,缺省情况下会优先使用「colordiff」,需要的话还可以激活「vimdiff」。

Shell工具:jsondiff.sh

标签:

原文地址:http://www.cnblogs.com/x113/p/4614965.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!