[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.'
原文地址:https://www.cnblogs.com/iiiiher/p/8016181.html