一、shell脚本(需要解释器)
    1.系统命令的堆积
    2.特定的语法+系统的命令=文件
    
二、shell脚本能做什么:
    基于标准化之上的 -> 工具化
    作用:简化操作步骤,提高效率,减少人为干预,减少系统故障
    1.自动化地完成基础配置
        (系统初始化操作、系统更新、内核调整、网络、时区、SSH优化)
    2.自动化安装程序
        (自动化安装LNMP、LAMP、MySQL、Nginx、Redis)
    3.自动化调整配置文件:
        (Nginx Conf、MySQL Conf)
    4.自动化部署业务(代码)
        部署php、java、秒级回退
    5.自动化定期备份回复程序
        (MySQL全备+增量+binlog+crond+shell脚本)
    6.自动化信息的采集(Zabbix + shell)
        硬件、系统、服务、网络等等
    7.日志的收集(ELK)
        收集->存储->展示->分析
        日志分析(取值—>排序->去重->统计->分析)
    8.自动化扩容/缩容(zabbix+shell)
        监控服务器,如果发现当某一个云主机cpu持续80%+触发动作(脚本)
        脚本:调用api开通云主机->初始化环境->加入集群->对外提供
        当前CPU使用率20%->判断有多啊好烧脑web结点->判断是否超过预设-(超)->缩减到对应预设状态->变更负载的配置
    9.shell什么都能做,但要符合实际情况以及实际业务需求

tip:编写shell脚本的小思路:1.取行->取值->对比->判断->输出->修改(监控)


三、Shell技能
    特性:
    变量
        自定义变量
        系统环境变量
        预定义变量
        位置参数变量
        内置
    条件判断,循环语句,流程控制,函数,数组,正则表达式

四、利用vim编写文本

 vi 文件名称

 {
     echo "123"
 }

此时文件是没有执行权限的,只有读写权限,若要可执行,则:
chmod u+x 文件名称


文件的运行可以有以下三种运行方式:
./文件名称          {但凡是 ./文件名称 均把此文件当做脚本去运行里面的命令。但需要添加执行权限}
bash 文件名称         {是使用bash shell解释器去执行文件中的命令,在解释器中执行,故文件不需要添加执行权限}
sh 文件名称         {等同于 bash 文件名称}

为了能够帮助系统更好地识别文本中的内容,通常在文本中的首行添加解释器路径,如 #!/bin/sh(不同的机子路径不同),若不在头部加解释器,那么只能指明解释器再运行文本中的内容。但在首行添加了解释器路径后,仍然需要给已经编写好的文件添加执行权限。故将文本内容修改为

vi 文件名称

{
    #!/bin/sh
    echo "123"
}

五、bash shell的特性
    1.自动补全: table 如果写错,则无法补全
    2.命令历史: history
    3.别名: alias {查看当前shell文件的别名,如 alias tt="echo tt"+回车+tt+alias,可以查看到当前shell的别名} unalias
    4.常用快捷键:Ctrl+u、k、a、e、l、c、z、d、w、r、y
    5.前台后台的作业控制: bg、fg、jobs、screen
    6.输入输出重定向 >,>>,1>,2>>,&>,cat <(表示读入一个文件)
    7.管道 | 左边命令结果 {如 ls | grep ta 表示查找当前目录中到有 ta 名字的文件}
    8.命令排序:{
        ; 可以将两个命令连续执行,且前面命令执行结果不影响后面命令的执行结果
        && 可以将两个命令连续执行,且前面命令执行不成功后面命令不执行
        || 可以将两个命令连续执行,且前面命令执行不成功后面命令继续执行
    }
    9.转义 \
    10.颜色

{
        echo -e "\033[30m 黑色字 \033[0m"
        echo -e "\033[31m 红色字 \033[0m"
        echo -e "\033[32m 绿色字 \033[0m"
        echo -e "\033[33m 向日葵色字 \033[0m"
        echo -e "\033[34m 蓝色字 \033[0m"
        echo -e "\033[35m 紫色字 \033[0m"
        echo -e "\033[36m 天篮字 \033[0m"
        echo -e "\033[37m 白色字 \033[0m"
        echo -e "\033[40m 黑底色 \033[0m"
        echo -e "\033[41m 红底色 \033[0m"
        echo -e "\033[42m 绿底色 \033[0m"
        echo -e "\033[43m 黄底色 \033[0m"
        echo -e "\033[44m 蓝底色 \033[0m"
        echo -e "\033[45m 紫底色 \033[0m"
        echo -e "\033[46m 天篮底色 \033[0m"
        echo -e "\033[47m 白底色 \033[0m"
}

  11.shell的内置命令:
        exit 退出整个程序
        break 结束当前循环,或跳出本层循环
        continue 忽略本层循环剩余代码,直接进行下一次循环

六、shell变量
    基本实例,在打开终端后,可以直接输入

{
        a=1
        b=2
        c=$a+$b
        echo $c|bc
}

    自定义变量:
        1.定义变量 变量名字=变量值
        2.引用变量 $变量名字 或者 ${变量名字}常量名字
        3.查看变量  echo $变量名字
                     set 显示所有变量,包含自定义变量和环境变量
        4.取消变量 unset 变量名字 作用范围:仅在当前shell中有效

    系统变量:
        定义环境变量 export 变量,将自定义的变量转换为环境变量
        引用环境变量 $变量名字 或者 ${变量名字}常量名字
        查看环境变量 echo  $变量名字 | grep 限制条件
        取消环境变量 unset 变量名称
        变量作用范围 在当前shell和子shell有效

    位置参数变量
        脚本参数传参: $1-9,${10},${11},${12}
        例如

 {
            #!/bin/sh
            read -p "please input anumber:" k
            t=9
            echo "this is $1"
            echo "this is $2"
            echo "this is $3"
            echo "this is test $t"
            echo "this is k $k"
}

    预定义变量:
        $0 脚本名称
            {若要只显示文件全名称,则要求使用 basename 全路径+文件名称.文件类型}
        $* 所有参数
        $@ 所有的参数
        $# 参数的个数
        $$ 当前进程的PID
        $!上一个后台进程的 PID
        $?上一个命令的返回值 0 表示成功

例如{
			#!/bin/sh
			echo "index 3 is $3"
			echo "index 2 is $2"
			echo "index 1 is $1"

			echo "all number: $*"
			echo "all number: $@"
			echo "number length is: $#"
			echo "now the PID is: $$"

			echo '$0='$(basename $0)
			echo '$4='$4
			echo '$5='$5
			echo '$6='$6
			echo '$*='$*
			echo '$@='$@
			echo '$#='$#
			echo '$$='$$

}

  关联数组:
1.定义关联数组,声明是关联数据
        declare -A 数组名称

  赋值法一:
数组名称[属性1]=属性值1
数组名称[属性2]=属性值2
数组名称[属性3]=属性值3

  赋值法二:
数组名称=([属性1]=属性值1 [属性2]=属性值2 [属性3]=属性值3)

  数组的显示:
数组值的显示 echo ${数组名称[*]} 或 echo ${数组名称[@]}
数组键的显示 echo ${!数组名称[*]} 或 echo ${!数组名称[@]}

瞬时显示数组赋值:declare -A

实例

{
	#!/bin/bash
	declare -A tt_array_1
	tt_array_1[name]=zhangsan
	tt_array_1[age]=18
	tt_array_1[skill]=linux

	declare -A tt_array_2
	tt_array_2=([name]=tt [age]=18 [sex]=m [book]=linux)

	echo ${tt_array_1[*]} 或 echo ${tt_array_2[@]}  #打印所有元素值
	echo ${!tt_array_1[*]} 或 echo ${!tt_array_2[@]}  #打印键

	declare -A
}

tip:onsql数据库之所以快是因为它采用了键值对

七、变量赋值与输出的方式
    变量赋值于输出实例:

{
        #!/bin/sh
        ip1=12345
        school="high shcool"
        today=`date +%F`
        today1=$(date +%F)

        echo $ip1
        echo $school
        echo $today
        echo $today1

}其中today和today1的显示方式一样,即两种变量的赋值效果是一样的

    1.显示赋值:
    变量名称=变量值

    2.read 从键盘读入变量值
    read -p "提示信息:" 变量名称
    read -t 时间(秒位单位) -p "提示信息:" 变量名称  限制输入变量的时间

其中(针对本人的Linux系统有){

                {
                    #!/bin/bash
                    read -t 5 -p "please name: " name
                }此情况下只有 ./文件名称 才可以正确运行


                {
                    #!/bin/sh
                    read -t 5 -p "please name: " name
                }此情况下只有 bash 文件名称 才可以正确运行,表示只有在程序启动5秒内才能输入信息
                若超过5秒则程序终止


}

  read -n2 -p "提示信息: " 变量名称  变量仅接收两个字符且无需按回车键

其中(针对本人的Linux系统有){

            {
                #!/bin/sh
                read -n2 -p "提示信息 " 变量名称
                echo "输出信息:$变量名称"
            }此情况下只有 bash 文件名称 才可以正确运行

}


    3.变量的输出
    ""    与    ''

{
        #!/bin/sh
        xyz=1000phone
        echo "${xyz} is good"    解析变量,将变量内容展示出来
        echo '${xyz} is good'    不解析变量,在''是什么内容就展示什么内容,这可以输出特殊字符
}


    ``与$()

{
        today=`date +%F`
        today1=$(date +%F)
        echo $today
        echo $today1
}today和today1的显示方式一样,即两种变量的赋值效果是一样的,
但是命令必须用  变量=$(命令) 的方式才能交命令结果赋值于变量

八、变量的数值运算:
    1.整数运算:

    {
        a=1
        b=2
        expr $a +、-、\*、%、/ $b
    }


    {
        echo $((数字 +、-、*、%、/、**、^ 数字)) 
        运算顺序遵从数学运算
    }


    {
        echo $[数字 +、-、*、%、/、**、^ 数字] 
        运算顺序遵从数学运算,可以嵌套()但不能嵌套[]
    }


    {
        let 变量名称=数字 +、-、*、%、/、**、^ 数字
        echo $变量名称
    }

    2.小数运算

    {
        echo "小数  +、-、*、%、/、**、^ 小数"  在用除法时仅输出结果整数部分
    }


    {
        echo "scale=2;4/8" |bc  定义以两位小数输出
    }

九、变量替代
    unset 变量1   清空变量中已经存在的值
    ${变量名-新的变量值}   
    变量没有被赋值:会使用“新的变量值”替代;变量有被赋值(包括空值)则不会被替代

    ${变量名:-新的变量值}   
    变量没有被赋值(包括空值):会使用“新的变量值”替代;变量有被赋值(不包括空值)则不会被替代

十、变量的自增
    此处的变量自增同常见编程语言的变量自增,如

{
        #!/bin/bash
        read -p "input anumber : " a
        echo "you input is $a"
        if [ $a -le 5 ];then
                let ++a
                echo "you input ++a is $a"
        else
                let --a
                echo "you input --a is $a"
        fi
}在本人的linux系统中,只有 bash 文件名称 才能执行
{
        #!/bin/bash
        read -p "input anumber : " a
        echo "you input is $a"
        while [ $a -le 5 ];do
                let a++
                echo "you input a plus one is :$a"
        done   
}在本人的linux系统中,只有 bash 文件名称 才能执行

十一、流程控制语句:

1选择If语句

        单分支:

{
		if [ 条件1 ];then
			结果1
		fi
}

        双分支:

{
		if [ 条件1 ];then
			结果1
		else
			结果2
		fi
}

        多分支:

{
		if [ 条件1 ];then
			结果1
		elif [ 条件2 ];then
			结果2
		elif [ 条件3 ];then
			结果3
		else
			结果4
		fi
}

2 选择case语句:

{
    	case 变量 in
	模式 1)
		命令序列1
		;;
	模式 2)
		命令序列2
		;;
	模式 3)
		命令序列3
		;;
	*)
		无匹配后命令序列
	esac
}

case实例:

实例{
		#!/bin/bash
		read -p "请输入数字:" num
		case $num in
			1)
				echo "你输入的是1"
				;;
			2)
				echo "你输入的是2"
				;;
			*)
				echo "你输入的不是1也不是2"
				exit 1
		esac
}

流程控制for循环

{
	for 变量名称 in {取值列表}
	do
		循环体
	done
}

for循环实例

实例一{
	#!/bin/bash
	for i in {1..5}
	do
	echo 123
	done
}
实例二{
	#!/bin/bash
	for i in a b c d e f
	do
	echo 123
	done
}

流程控制while循环

{
	while 条件测试
	do
		循环体
	done
}

while实例

实例一:每隔1秒钟打印一次日期{
	while date
	do
		date
	    sleep 1
	done
}此程序需要Ctrl+c才能停止

十二、函数

    一、函数的作用
        1.自定义一堆命令
        2.避免大量的重复代码,加强可读性
        3.可以只定义函数,如不被调用则不被执行

    二、定义函数
        方式一:
            function 函数名称(){函数体}
        方式二:
            函数名称(){函数体}
    2.调用函数(函数要先定义,再使用)
        方式一:
            直接调用函数名称
    3.函数返回值
        return 整数值

    4.函数传参
        1.函数的参数可以是用户直接输入
        2.函数的参数可以是set内置输入(重置)
        3.fun $1 传入脚本后第一个参数
        4.fun $* 接收所有参数的传递

实例

1.判断某个文件是否存在{
	#!/bin/sh
	file=文件路径/文件名称.文件类型
	j_file(){
		if [ -f $file ];then
			echo "此文件存在"
			return 0
		else
			echo "此文件不存在"
			return 1;
		fi
	}
	j_file	
}
2.判断用户输入数字等级{
	#!/bin/sh
	g_num(){
		read -p "请输入1-10的一个整数:" num
		if [ $num -ge 0 -a $num -le 3 ];then
			echo "你输入的等级是:A"
			return 0
		elif [ $num -ge 2 -a $num -le 5 ];then
			echo "你输入的等级是:B"
			return 1
		elif [ $num -ge 4 -a $num -le 7 ];then
			echo "你输入的等级是:C"
			return 2
		elif [ $num -ge 6 -a $num -le 9 ];then
			echo "你输入的等级是:D"
			return 3
		elif [ $num -ge 8 -a $num -le 11 ];then
			echo "你输入的等级是:E"
			return 4
		fi
	}
	g_num
}

以上是本人今日小节,不喜勿喷,感谢理解

相关连接:

【Linux学习(1)】----基础命令篇(1)_lixxkv的博客-CSDN博客

【Linux学习(2)】----shell编程篇(2)_lixxkv的博客-CSDN博客

Logo

更多推荐