• Shell编程之数组


    一、Shell数组

    1.什么是Shell数组

    是一个元素集合,它把有限个元素(变量或字符内容)用一个名字来命名,然后用编号对它们进行区分。

    2.Shell数组的定义

    方法1:
    array=(value1 value2 value3 ...)

    [root@codis-178 ~]# array=(1 2 3)
    [root@codis-178 ~]# echo ${array[*]}
    1 2 3
    

    方法2:
    array=([1]=one [2]=two [3]=three)

    [root@codis-178 ~]# array=([1]=one [2]=two [3]=three)
    [root@codis-178 ~]# echo ${array[*]}
    one two three
    [root@codis-178 ~]# echo ${array[1]}
    one
    [root@codis-178 ~]# echo ${array[2]}
    two
    [root@codis-178 ~]# echo ${array[3]}
    three
    

    3.Shell数组的输出

    (1)打印数组元素

    [root@codis-178 ~]# array=(one two three)
    [root@codis-178 ~]# echo ${array[1]}
    two
    [root@codis-178 ~]# echo ${array[2]}
    three
    [root@codis-178 ~]# echo ${array[@]}
    one two three
    

    (2)打印数组元素的个数

    [root@codis-178 ~]# echo ${array[*]}
    one two three
    [root@codis-178 ~]# echo ${#array[*]}
    3
    [root@codis-178 ~]# echo ${#array[@]}
    3
    

    (3)数组赋值

    [root@codis-178 ~]# array[3]=four
    [root@codis-178 ~]# echo ${array[*]}
    one two three four
    [root@codis-178 ~]# array[0]=lodboy
    [root@codis-178 ~]# echo ${array[*]}
    lodboy two three four
    

    (4)数组的删除

    [root@codis-178 ~]# echo ${array[*]}
    lodboy two three four
    [root@codis-178 ~]# unset array[1]
    [root@codis-178 ~]# echo ${array[*]}
    lodboy three four
    [root@codis-178 ~]# unset array[0]
    [root@codis-178 ~]# echo ${array[*]}
    three four
    

    (5)数组内容的截取和替换

    截取:
    [root@codis-178 ~]# array=(1 2 3 4 5)
    [root@codis-178 ~]# echo ${array[@]:1:3}
    2 3 4
    [root@codis-178 ~]# array=($(echo {a..z}))
    [root@codis-178 ~]# echo ${array[@]}
    a b c d e f g h i j k l m n o p q r s t u v w x y z
    [root@codis-178 ~]# echo ${array[@]:1:3}
    b c d
    [root@codis-178 ~]# echo ${array[@]:0:2}
    a b
    
    替换(不会改变原先数组的内容):
    [root@codis-178 ~]# array=(1 2 3 1 1)
    [root@codis-178 ~]# echo ${array[@]/1/b}
    b 2 3 b b
    

    二、Shell数组的实践

    1.简单实现

    (1)使用循环批量输出数组的元素

    [root@codis-178 ~]# cat 13_1.sh
    #!/bin/bash
    array=(1 2 3 4 5)
    for((i=0;i<${#array[*]};i++))
    do
    	echo ${array[i]}
    done
    [root@codis-178 ~]# sh 13_1.sh
    1
    2
    3
    4
    5
    

    (2)通过竖向列举定义数组元素并批量打印

    [root@codis-178 ~]# cat 13_2.sh
    #!/bin/bash
    array=(
    oldboy
    oldgirl
    xiaotong
    bingbing
    )
    for((i=0;i<${#array[*]};i++))
    do
    	echo ${array[i]}
    done
    echo "array len:${#array[*]}"
    [root@codis-178 ~]# sh 13_2.sh
    oldboy
    oldgirl
    xiaotong
    bingbing
    array len:4
    

    (3)将命令结果作为数组元素定义并打印

    [root@codis-178 ~]# mkdir -p array
    [root@codis-178 ~]# touch array/{1..3}.txt
    [root@codis-178 ~]# ls array/
    1.txt  2.txt  3.txt
    
    [root@codis-178 ~]# cat 13_3.sh
    #!/bin/bash
    dir=($(ls array/))
    for((i=0;i<${#dir[*]};i++))
    do
    	echo "This is NO.$i,filename is ${dir[$i]}"
    done
    [root@codis-178 ~]# sh 13_3.sh
    This is NO.0,filename is 1.txt
    This is NO.1,filename is 2.txt
    This is NO.2,filename is 3.txt
    

    2.Shell数组的重要命令

    (1)定义命令
    静态
    array=(1 2 3)
    动态
    array=($(ls))
    赋值
    array[3]=4

    (2)打印命令
    所有元素
    ${array[@]}或${array[]}
    长度
    ${#array[@]}或${#array[
    ]}
    单个元素
    ${array[i]}

    3.Shell数组实战

    (1)利用bash for循环打印下面这句话中字母数不大于6的单词
    I am oldboy teacher welcome to oldboy trainning class

    [root@codis-178 ~]# cat 13_4.sh
    #!/bin/bash
    
    arr=(I am oldboy teacher welcome to oldboy trainning class)
    for((i=0;i<${#arr[*]};i++))
    do
    	if [ ${#arr[i]} -lt 6 ]
    		then
    			echo "${arr[i]}"
    	fi
    done
    
    [root@codis-178 ~]# sh 13_4.sh
    I
    am
    to
    class
    

    (2)批量检查多个网站地址是否正常
    要求:
    1)使用数组
    2)每5秒进行一次全部检测,无法访问报警
    3)检测地址:
    http://www.baidu.com
    http://www.163.com
    http://www.anzhi.com

    [root@codis-178 ~]# cat 13_5.sh
    #!/bin/bash
    . /etc/init.d/functions
    
    eheck_count=0
    url_list=(
    http://www.baidu.com
    http://www.163.com
    http://www.anzhi.com
    )
    
    function wait(){
    	echo -n '3秒后。执行检查URL操作。'
    	for((i=0;i<3;i++))
    	do
    		echo -n ".";sleep 1
    	done
    	echo
    }
    
    function check_url(){
    	wait
    	for(( i=0; i<`echo ${#url_list[*]}`; i++ ))
    	do
    		wget -o /dev/null -T 3 --tries=1 --spider $(url_list[$i]) >/dev/null 2>&1
    		
    		if [ $? -eq 0 ]
    			then
    				action "$(url_list[$i])" /bin/true
    		else
    			action "$(url_list[$i])" /bin/false
    		fi
    	done
    	((check_count++))
    }
    
    main(){
    	while true
    	do
    		check_url
    		echo "---------check count:${check_count}------------"
    		sleep 5
    	done
    }
    main
    
    [root@codis-178 ~]# sh 13_5.sh
    3秒后。执行检查URL操作。...
    http://www.baidu.com                                       [  OK  ]
    http://www.163.com                                         [  OK  ]
    http://www.anzhi.com                                       [  OK  ]
    ---------check count:1------------
    3秒后。执行检查URL操作。...
    http://www.baidu.com                                       [  OK  ]
    http://www.163.com                                         [  OK  ]
    http://www.anzhi.com                                       [  OK  ]
    ---------check count:2------------
    3秒后。执行检查URL操作。...
    http://www.baidu.com                                       [  OK  ]
    http://www.163.com                                         [  OK  ]
    http://www.anzhi.com                                       [  OK  ]
    ---------check count:3------------
    3秒后。执行检查URL操作。...
    http://www.baidu.com                                       [  OK  ]
    http://www.163.com                                         [  OK  ]
    http://www.anzhi.com                                       [  OK  ]
    

    (3)开发一个每30秒监控MySQL主从复制是否异常的脚本

    [root@codis-178 ~]# cat 13_6.sh
    #!/bin/bash
    #######################################
    # this script function is:
    # check_mysql_slave_replication_status
    # USER     YYYY-MM-DD - ACTION
    # xiaoda   2017-08-30 - Created
    ######################################
    path=/server/scripts
    MAIL_GROUP="xiaoda@163.com xiao@163.com"
    PAGER_GROUP="13929087438 18753928455"
    LOG_FILE="/tmp/web_check.log"
    USER=root
    PASSWORD=123456
    PORT=3306
    MYSQLCMD="mysql -u$USER -p$PASSWORD -S /data/$PORT/mysql.sock"
    
    error=(1008 1007 1062)
    RETVAL=0
    [ ! -d "$path" ] $$ mkdir -p $path
    
    function JudgeError(){
    	for(( i=0; i<${#error[*]}; i++))
    	do
    		if [ "$1" == "${error[$i]}" ]
    			then
    				echo "MySQL slave error is $1,auto repairing it."
    				$MYSQLCMD -e "stop slave;set global sql_slave_skip_counter=1;start slave;"
    		fi
    	done
    	return $1
    }
    
    function CheckDb(){
    	status=($|awk -F ':' '/_Running|Last_Error|_Behind/{print $NF}' slave.log)
    	expr ${status[3]} + 1 &>/dev/null
    	if [ $? -ne 0 ];then
    		status[3]=300
    	fi
    	if [ "${status[0]}" == "Yes" -a "${status[1]}" == "Yes" -a ${status[3]} -lt 120 ]
    		then
    			return 0
    	else
    		JudgeError ${status[2]}
    	fi
    }
    
    function MAIL(){
    	local SUBJECT_CONTENT=$1
    	for MAIL_USER in `echo $MAIL_FROUP`
    	do
    		mail -s "$SUBJECT_CONTENT " $MAIL_USER <$LOG_FILE
    	done
    }
    
    function PAGER(){
    	for PAGER_USER in `echo $PAGER_GROUP`
    	do
    		TITLE=$1
    		CONTACT=$PAGER_USER
    		HTTPGW=http://oldboy.sms.cn
    		curl -d cdkey=5ADF-EFA -d password=123 -d phone=$CONTACT -d message="$TITLE[$2]"
    	done
    }
    
    function SendMsg(){
    	if [ $1 -ne 0 ]
    		then
    			RETVAL=1
    			NOW_TIME=`date +"%Y-%M-%d %H:%M:%S"`
    			SUBJECT_CONTENT="mysql slave is error, error is $2,${NOW_TIME}."
    			echo -e "$SUBJECT_CONTENT"|tee $LOG_FILE
    			MAIL $SUBJECT_CONTENT $NOW_TIME
    	else
    		echo "Mysql slave status is ok"
    		RETVAL=0
    	fi
    	return $RETVAL
    }
    function main(){
    	while true
    	do
    		CheckDb
    		SendMsg
    		sleep 30
    	done
    }
    main
    

    三、运维必会的脚本

    1.系统及各类服务监控脚本(文件、内存、磁盘、端口、URL)
    2.文件篡改,篡改恢复脚本
    3.各类服务Rsync、Nginx、MySQL等启停脚本
    4.MySQL主从复制监控及自动恢复脚本
    5.一键配置MySQL多实例及主从的脚本
    6.监控HTTP、MySQL、Rsync、NFS、Memcached等服务脚本
    7.一键安装LNMP、一键优化Linux系统、一键安装数据库及优化等脚本
    8.MySQL分库、分表、自动备份脚本
    9.根据网络连接数及Web日志PV数封IP脚本
    10.监控网站的PV及流量
    11.检查Web服务器多个URL地址脚本
    12.批量创建用户及设置随机密码脚本

    VIM编辑器的优化

    vim /etc/vimrc
    #关闭兼容模式
    set nocompatible
    #设置历史记录步数
    set history=100
    #开启相关插件
    filetype on
    filetype plugin on
    filetype indent on
    #当文件在外部被修改时自动更新文件
    set autoread
    #激活鼠标的使用
    set mouse=a
    #开启语法
    stntax enable
    #高亮显示当前行
    set cursorline
    hi cursorline guibg=#00ff00
    hi CursorColumn guibg=#00ff00
    set nofen
    set fdl=0
    #使用空格来替换Tab
    set expandtab
    #设置所有的Tab和缩进为4个空格
    set tabstop=4
    #设置<<和>>命令移动时的宽度为4
    set shiftwidth=4
    #使得按退格键时可以一次删掉4个空格
    set softtabstop=4
    set smarttab
    #自动缩进
    set ai
    #智能缩进
    set si
    #自动换行
    set wrap
    #设置软宽度
    set sw=4
    set wildmenu
    #显示标尺
    set ruler
    #设置命令行的高度
    set cmdheight=1
    #显示行数
    set lz
    #设置退格
    set backspace=col,start,indent
    set whichwrap+=<,>,h,l
    set magic
    #关闭错误时的声音提示
    set noerrorbells
    set novisualbell
    #显示匹配的括号
    set showmatch
    set mat=2
    #搜索时高亮显示搜索内容
    set hlsearch
    #搜索时不区分大小写
    set ignorecase
    #设置编码
    set encoding=utf-8
    #设置文件编码
    set fileencodings=utf-8
    #设置终端编码
    set termencoding=utf-8
    #开启新行时使用自动缩进
    set smartindent
    set cin
    set showmatch
    #隐藏工具栏
    set guioptions-=T
    #隐藏菜单栏
    set guioptions-=m
    #置空错误铃声
    set vb t_vb=
    #显示状态栏
    set laststatus=2
    #粘贴不换行问题的解决方法
    set pastetoggle=<F9>
    #设置背景
    set background=dark
    #设置高亮
    highlight Search ctermbg=black ctermfg=white guifg=white guibg=black
    #自动增加解释器及作者版本等信息
    autocmd BufNewFile *.sh exec ";call SetTitle()"
    func SetTitle()
        if expand("%:e") == 'sh'
            call setline(1, "#!/bin/bash")
            call setline(2, "#Author:xiaoda")
            call setline(3, "#Time:".strftime("%F %T"))
            call setline(4, "#Name:".expand("%"))
            call setline(5, "#Version:V1.0")
            call setline(6, "#Description:This is a test script")
        endif
    endfunc
    
  • 相关阅读:
    npm install 的时候报错 (Unexpected end of JSON input while parsing near)
    vue 父子组件以及非父子组件如何通信
    webstorm 破解版下载及破解教程------永久使用
    判断数据类型
    洗牌算法
    原生js实现图片懒加载
    React(^16.8) 新增特性Hook
    Blob、ArrayBuffer、File、FileReader和FormData的区别
    React中的Dom操作
    微信小程序填坑总结
  • 原文地址:https://www.cnblogs.com/tongxiaoda/p/7454672.html
Copyright © 2020-2023  润新知