zoukankan      html  css  js  c++  java
  • [sh]shell脚本栗子

    我会定期的把看到的一些好的shell和py脚本搜集在这里,供参考学习:

    命令行回收站

    推荐一个不相关的:trash-cli,就是命令行版的回收站,它的神奇之处在于不是简单的把文件移动到回收站,而且可以在回收站里恢复。所以它说自己是Command line interface to the freedesktop.org trashcan,我的 zshrc 里有一行:alias rt="trash"
    

    shell资源:
    常用的一些script:

    检查操作系统,内核,多少bit等
    https://github.com/lannyMa/ops_doc/tree/master/LazyManage

    执行时候加参数 -h start等
    https://github.com/johanhaleby/kubetail/blob/master/kubetail

    理解linux一个方言: 2>&1
    http://chuansong.me/n/1108379451851

    https://github.com/spujadas/elk-docker/blob/master/elasticsearch-init

    100-shell-script-examples
    https://github.com/itech001/100-shell-script-examples

    数组操作

    数组的定义,遍历
    for((i=0;i<${#arr[*]};i++));do
        echo ${arr[i]}
    done
    
    echo
    echo '---------------'
    
    for i in ${arr[@]};do
        echo $i
    done
    
    取指定数组范围:
    $ a=(1 2 3 4 5)
    #从下标1开始取,取3位。
    $ echo ${a[@]:1:3}  
    2 3 4
    

    参考: https://github.com/influxdata/influxdata-docker/blob/master/influxdb/1.4/entrypoint.sh

    #!/bin/bash
    set -e
    
    if [ "${1:0:1}" = '-' ]; then
        set -- influxd "$@"
    fi
    
    if [ "$1" = 'influxd' ]; then
    	/init-influxdb.sh "${@:2}"
    fi
    
    exec "$@"
    

    性能等

    创建一个300M的文件,预分配空间

    fallocate -l 300M bigfile 
    

    查帮助

    • 中文化sh
    yum install man-pages-zh-CN -y
    echo 'LANG="zh_CN.UTF-8"' >> ~/.bashrc
    echo 'LANGUAGE="zh_CN:zh"' >> ~/.bashrc
    source ~/.bashrc
    
    • shell自动补全
    yum install bash-com*
    
    • 查看shell选项
    man sh
    

    脚本出错退出

    set -ue 遇到错误退出
        -x debug模式
    

    生成序列

    {2..10}
    seq 10
    for ((i=0,i<10;i++));do done
    
    for i in `ls /`;do
        echo ${i}_$(date +%F)
    done
    
    

    seq分割,tr替换某个字符

    {}只能搞连续的
    echo {1..10}  
    
    seq可以搞不连续的
    $ seq -s ':' 1 10|tr ":" "-"
    1-2-3-4-5-6-7-8-9-10
    
    $ seq -s ':' 1 2 10|tr ":" "-"
    1-3-5-7-9
              分割  开始 步长 结束
    
    seq [OPTION]... LAST
    seq [OPTION]... FIRST LAST
    seq [OPTION]... FIRST INCREMENT LAST
    

    判断变量是否存在

    man sh
    -z  如果变量值长度为0,则为真
    
    -d
    -f
    -w 可写
    -x 可执行   --启动脚本是否可执行
    -e 是否存在.--配置文件是否存在
    

    数学运算

    $[$a+$b]
    

    监控网卡流量(数据包个数/字节数)

    #!/usr/bin/env bash
    
    
    #/sys/class/net/eth0/statistics/rx_packets: 收到的数据包数据
    #/sys/class/net/eth0/statistics/tx_packets: 传输的数据包数量
    #/sys/class/net/eth0/statistics/rx_bytes: 接收的字节数
    #/sys/class/net/eth0/statistics/tx_bytes: 传输的字节数
    #/sys/class/net/eth0/statistics/rx_dropped: 当收到包数据包下降的数据量
    #/sys/class/net/eth0/statistics/tx_dropped: 传输包数据包下降的数据量
    
    
    function get_pkgs(){
        rx_packets=$(cat /sys/class/net/eth0/statistics/rx_packets)
        tx_packets=$(cat /sys/class/net/eth0/statistics/tx_packets)
        rx_bytes=$(cat /sys/class/net/eth0/statistics/rx_bytes)
        tx_bytes=$(cat /sys/class/net/eth0/statistics/tx_bytes)
    
        rx_kb=$[$rx_bytes/1024/1024]
        tx_kb=$[$tx_bytes/1024/1024]
    }
    
    function print(){
        get_pkgs
        echo -n "数据包/收: ";
        echo -n "数据包/发: ";
        echo -n "数据包/发-字节: "${rx_kb} Mb;
        echo -n "数据包/收-字节: "${tx_kb} Mb;
        sleep 1
    }
    
    while :;do
        print
        echo
        sleep 1
    done
    
    

    判断参数个数

    function help(){
        echo "usage: xxx
              this is a test
        "
    }
    
    # 参数总数
    #if [ $# -eq 0 ];then
    #    help
    #elif [ $1 == "22" ];then
    #    echo "22 happy"
    #else
    #    echo "default..."
    #fi
    
    # 参数是否存在
    if [ ! -z "$1" ];then
        echo $1
    else
        echo "very sad"
    fi
    

    判断执行参数和目录是否存在

    参考: https://github.com/jenkinsci/docker/blob/master/plugins.sh

    set -e
    
    echo "WARN: plugins.sh is deprecated, please switch to install-plugins.sh"
    
    if [ -z "$1" ]
    then
        echo "
    USAGE:
      Parse a support-core plugin -style txt file as specification for jenkins plugins to be installed
      in the reference directory, so user can define a derived Docker image with just :
      FROM jenkins
      COPY plugins.txt /plugins.txt
      RUN /usr/local/bin/plugins.sh /plugins.txt
      Note: Plugins already installed are skipped
    "
        exit 1
    else
        JENKINS_INPUT_JOB_LIST=$1
        if [ ! -f "$JENKINS_INPUT_JOB_LIST" ]
        then
            echo "ERROR File not found: $JENKINS_INPUT_JOB_LIST"
            exit 1
        fi
    fi
    

    如果参数不对,输出help信息

    usage="${PROGNAME} <search term> [-h] [-c] [-n] [-t] [-l] [-s] [-b] [-k] [-v] -- tail multiple Kubernetes pod logs at the same time
    where:
        -h, --help           Show this help text
        -c, --container      The name of the container to tail in the pod (if multiple containers are defined in the pod).
                             Defaults to all containers in the pod. Can be used multiple times.
        -t, --context        The k8s context. ex. int1-context. Relies on ~/.kube/config for the contexts.
        -l, --selector       Label selector. If used the pod name is ignored.
        -n, --namespace      The Kubernetes namespace where the pods are located (defaults to "default")
        -s, --since          Only return logs newer than a relative duration like 5s, 2m, or 3h. Defaults to 10s.
        -b, --line-buffered  This flags indicates to use line-buffered. Defaults to false.
        -e, --regex          The type of name matching to use (regex|substring)
        -j, --jq             If your output is json - use this jq-selector to parse it.
                             example: --jq ".logger + \" \" + .message"
        -k, --colored-output Use colored output (pod|line|false).
                             pod = only color pod name, line = color entire line, false = don't use any colors.
                             Defaults to line.
        -z, --skip-colors    Comma-separated list of colors to not use in output
                             If you have green foreground on black, this will skip dark grey and some greens -z 2,8,10
                             Defaults to: 7,8
            --timestamps     Show timestamps for each log line
            --tail           Lines of recent log file to display. Defaults to -1, showing all log lines.
        -v, --version        Prints the kubetail version
    examples:
        ${PROGNAME} my-pod-v1
        ${PROGNAME} my-pod-v1 -c my-container
        ${PROGNAME} my-pod-v1 -t int1-context -c my-container
        ${PROGNAME} '(service|consumer|thing)' -e regex
        ${PROGNAME} -l service=my-service
        ${PROGNAME} --selector service=my-service --since 10m
        ${PROGNAME} --tail 1"
    
    if [ $# -eq 0 ]; then
        echo "$usage"
        exit 1
    fi
    
    

    ansible备份scm的脚本

    - hosts: scm-server
      remote_user: root
      vars:
      - sfpath: "/data/backup/scm-data/*_$(date +%F -d '-1 day')_scmdata.tar.gz"
      - dfpath: "/data/data/backup/scm-data/"
      tasks:
        - name: Package | prepare the tar data on scm-server
          # 0, clean the backup dir /data/backup/scm-data
          # 1, copy the /root/.scm to /data/backup/scm-data
          # 3, tar today's scm data
          raw:
               cd /data/backup/scm-data 
               && 
    m -rf *.tar.gz .scm 
               && cp -r /root/.scm /data/backup/scm-data/ 
               # 192.168.x.x_2017-12-12_scmdata.tar.gz
               && tar zcf /data/backup/scm-data/`ifconfig|sed -n '2p'|awk -F':' '{print $2}'|awk '{print $1}'`_$(date +%F -d '-1 day')_scmdata.tar.gz .scm
    
        - name: SYN_PKG | syn the today's scm data to backup server
          synchronize:
            src: "{{ sfpath }}"
            dest: "{{ dfpath }}"
            mode: pull
    
        # 远程解压
        # - name "this vm restore scm data to test data on app"
        #   unarchive:
        #     src: "{{ dfpath }}"
        #     dest: /root
        #     remote_src: True
    
    
    - hosts: scm-server
      remote_user: root
      tasks: 
        # 清理本地scm压缩包,仅保存7天的压缩包. 
        - name: Keeps scm-data.tar.gz of 7 days in local
          shell: find /data/data/backup/scm-data/ -name "*.tar.gz"  -type f -mtime +7|xargs rm -f
    
        # 完事后,发邮件.
        - name: sendMail to op
          mail:
            host: smtp.sina.com
            port: 25
            username: maotai@sina.com
            password: 123456
            from: maotai@qq.com (maotai)
            to: maotai2 <maotai2>
            # cc: John Doe <j.d@example.org>, Suzie Something <sue@example.com>
            # attach: /etc/fstab /etc/hosts
            subject: scm_data backup successfully
            body: 'System {{ ansible_hostname }}-192.168.x.x from 192.168.y.y scm-data/backup has been successfully provisioned.'
    
  • 相关阅读:
    ASP.NETLinkButton的Click事件中获取CommandArgument的值
    关于绑定了GridView控件后怎么截取字符串和CSS样式来控制表头不换行
    自动生成不重复的含有数字和字母的随机码
    ASP.NET母版页
    C#随机不重复数字字符串2
    asp.net中实现在文本框按下回车键后相当于按下tab键focus跳到下一个文本框
    ASP.NET获取<EmptyDataTemplate></EmptyDataTemplate>模板中的textBox控件值
    C#生成拼音简码
    gridview获取当前行索引的方法大集合
    一、XML
  • 原文地址:https://www.cnblogs.com/iiiiher/p/8016181.html
Copyright © 2011-2022 走看看