shell 脚本

shell 脚本

1. 什么是shell

​ 1.命令的堆积

​ 2.特定的语法+系统的命令=文件
​ 3.需要解释器解释

2. shell 脚本能做什么

  • 基于标准化之上的工具

  • 作用:简化操作步骤,提高工作效率,减少人为干预,减少系统故障
    1.自动化的完成基础配置(系统初始化操作,系统更新,内核调整,网络,时区,SSH 优化)
    2.定期备份恢复程序
    3.自动化信的息采集(zabbix + shell)
    硬件、系统、服务、网络
    4.自动化安装程序、调整配置文件、日志收集、自动化扩容/缩容

3. shell 脚本的特性

​ 1.命令补全和文件路径补全

​ 2.命令历史记忆

​ 3.别名功能

4.常用快捷键

​ Ctrl + Z 正在运行的程序送到后台
​ Ctrl + D 退出当前终端
​ Ctrl + A 移动光标到所在行首
​ Ctrl + E 与 Ctrl+A 相反
​ Ctrl + U 清空输入的命令
​ Ctrl + W 擦除到行首和行尾的文本
​ Ctrl + Y 撤回删除内容

​ 5.前后台作业控制

​ 6.输入输出重定向

​ 7.管道

  • tee 将管道获取的内容输入到另一个文件中

    [root@elk-3 shell]# cat re.txt | tee re.txt_bak
    
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    

8.命令排序

  • ;没有逻辑关系

  • || 前面执行不成功,执行后置

  • && 前面执行成功,则执行后者

9.shell 通配符

* 匹配任意多个字符

? 匹配任意一个字符

[ ] 匹配括号内任意一个字符

() 在子 shell 中执行

{} 集合

\ 转义符

10.echo 颜色输出

[root@elk-3 shell]# echo -e "\033[31m 红色字 \033[0m"
 红色字 //红色
[root@elk-3 shell]# 

4.变量

1. 自定义变量

  • 定义变量:

    变量名=变量值
    
  • 引用变量:

    $变量名 或 ${变量名}【相当于字符串拼接】
    
  • 查看变量:

    echo $变量名  set 显示所有变量
    
  • 取消变量:

    unset 变量名 
    
  • 作用范围:
    仅在当前 shell 中有效,但可以使用:source + 文件路径 获取

2. 系统环境变量

  • 定义环境变量:

    export 变量名=变量值    #将自定义变量转换成环境变量 
    
  • 引用环境变量:

    $变量名 或 ${变量名}   #${变量名}后面可追加字符串
    
  • 查看环境变量:

    echo $变量名 env | grep Name"
    
  • 取消环境变量:

    unset 变量名
    
  • ​ 变量作用范围:

    当前和子 shell 有效

3. 位置参数变量

  • 脚本参数传参:

    $1,$2,....,${10}	
    
    [root@elk-3 shell]# sh t1.sh hello world
    
    hello
    world
    
    [root@elk-3 shell]# cat t1.sh 
    
    #!/usr/bin/bash
    echo $1
    echo $2
    

4. 预先定义变量

  • $0 脚本的文件名
  • $* 所有的参数
  • $# 参数的个数
  • $! 上一个后台进程的 PID
  • $? 上一个命令的返回值是零表示成功

5. 变量赋值方式

  • 命令用 $() 反引号双引号是弱引用【解析变量】,单引号是强引用【即所输即所得】

6. 整数运算

[root@elk-3 shell]# a=1
[root@elk-3 shell]# b=2
[root@elk-3 shell]# c=$(expr $a + $b)  ######第一种方法
[root@elk-3 shell]# echo $c
3
[root@elk-3 shell]# d=$((( $a + $b)))  ######第二种方法
[root@elk-3 shell]# echo $d
3
[root@elk-3 shell]# e=$[$a + $d]       ######第三种方法
[root@elk-3 shell]# echo $e
4
[root@elk-3 shell]# let a++			   ######使变量自增
[root@elk-3 shell]# echo $a
2

7. 变量替代

[root@elk-3 shell]# name=gx
[root@elk-3 shell]# echo $name

gx

[root@elk-3 shell]# unset name
[root@elk-3 shell]# echo $name

[root@elk-3 shell]# echo ${name-name}

name

8. 变量自增

#!/usr/bin/bash
i=0
while (($i <  5));do  //只能用符号
        let i++
        echo $i
done

9. 从键盘读入变量

read -t 5 -p "" 变量名      //-t 5 五秒不写自动退;-p "内容" 显示到命令行 

5. 条件判断

1. 条件测试

  • 格式1:test 条件表达式
  • 格式2:[ 条件表达式 ] 注意空格,因为 [ 是一个命令
  • 格式3:[[ 条件表达式 ]] 正则

2. 文件是否存在

  • -e filename 如果 filename存在,则为真
  • -d filename 如果 filename为目录,则为真
  • -f filename 如果 filename为常规文件,则为真
  • -L filename 如果 filename为符号链接,则为真
  • -r filename 如果 filename可读,则为真
  • -w filename 如果 filename可写,则为真
  • -x filename 如果 filename可执行,则为真
  • -s filename 如果文件长度不为0,则为真
  • -h filename 如果文件是软链接,则为真

3. 数值比较:

  • -gt 大于 -lt 小于

  • -eq 等于 -ne 不等于

  • -ge 大于等于 -le 小于等于

4. 且或非:

  • -a 且and
  • -o 或or

5. 磁盘使用状态

  • 分析:

    • 怎么查看磁盘使用率

      df -h | grep "/$" | awk '{print $5}' | awk -F '%' '{print $1}'   //先找到所有的磁盘使用情况,然后找到root的磁盘使用情况,然后定位到使用率,最后获取那个值
      
    • 数值比对
      if 判段语句

  • 代码示例如下:

# !/usr/bin/bash
disk_free=$(df -h | grep "/$" | awk '{print $5}' | awk -F '%' '{print $1}')

if [ $disk_free -ge 6 ];then

	if [ ! -e /tmp/test.txt ];then

			touch /tmp/test.txt

  	fi

  	echo "Disk Free is very high" > test.txt

fi

6. 使用shell 安装nginx

# !/bin/bash
if [ $? -eq 0 ];then
        yum repolist | grep nginx
        if [ $? -eq 0 ];then
                if [ flag -eq 0 ];then
                        echo "nginx is already installed"

                fi
        else
                cat > /etc/yum.repos.d/nginx.repo <<-EOF
                [nginx-stable]
                name=nginx stable repo
                gpgcheck=1
                enabled=1
                gpgkey=https://nginx.org/keys/nginx_signing.key
                module_hotfixes=true

                [nginx-mainline]
                name=nginx mainline repo
                baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
                gpgcheck=1
                enabled=0
                gpgkey=https://nginx.org/keys/nginx_signing.key
                module_hotfixes=true
                EOF
                yum makecache > /dev/null  && yum install -y nginx > /dev/null
                if [ $? -eq 0 ];then
                        echo "nginx is already installed"
                        systemctl start nginx
                        nginx_status=$(systemctl status nginx | grep "Active" | awk '{print $1,$2,$3}')
                else
                        echo "please search the reason"
                fi


        fi
else
        echo "please check your network"
fi

6. 循环语句

1. for语法:

for 变量名 in [取值列表]
do
	循环体
done
  • 示例:

    # !/usr/bin/bash
    for i in {0..5}
    do
    	echo $i
    done
    echo "==============="
    for j in {A..E} #对应阿斯科马的顺序
    do
    	echo $j
    done
    echo "============"
    for n in $(ls /tmp/shell)
    do
    	echo $n
    done
    echo "============="
    for b in $(seq 1 5)
    do 
    	echo $b
    done
    for  (( i=1;i<=5;i++ ))
    do
          echo $i
     done
          
    

2. 流程控制

  • 语法:

    case 变量 in
    	模式1)
    		命令
    		;;
    	模式2)
    		命令					
    		;;
    	*)
    		命令
    		;;
    esac
    

3. while 循环

while 条件语句;do
	循环体
done
  • 代码示例

    while read line
    do
    	echo $line | awk -F ":" '{print $NF}' 
    done < /etc/passwd
    echo "=================="
    
    i=0
    while (($i < 10));do
    	echo $i
    	i=$(expr $i + 1) 
    done
    
    echo "================="
    
    while true;do
    	echo "死循环"
    	break
    done
    

7. shell 内置命令

  • exit 退出整个循环
  • break 结束当前循环,或跳出本层循环
  • continue 忽略本次循环剩余的代码,直接进行下一次循环

8. 关联数组

定义数组

declare -A 数组名字

给数组传一个值

数组名字[索引]=#索引即为 key ,可以是字母

给数组传多个值

数字名字={[key1]=value1,[key2]=value2}

打印数组的值

echo ${数组名字[key]}

打印数组的索引

echo ${数组名字[value]}

打印数组的长度

echo ${#数组名字[*]}

9. 函数

1. 定义函数和调用函数

  • 示例代码

    #!/usr/bin/bash
    
    #第一中定义函数的方式
    function hello(){
    	echo "hello world 1"
    }
    hello
    
    #第二种第一函数的方式
    dome(){
    	echo "hello world 2"
    }
    
    dome
    
  • 函数的返回值

    #!/usr/bin/bash
    function f_err(){
    	echo "it is error!"
    	return 2
    }
    f_err
    echo $?
    #执行该代码结果为 2,便于确定错误位置
    

10. 指定位置参数

#!/usr/bin/bash
set 1 3 4 5
count=1
for i in $*;do
	echo "指定的参数是:$i"
done

​ 正则表达式

11. 案例

主机存活状态

#!/usr/bin/bash

IP=192.168.80.
for i in {125..135};do
	
	{ 
	for j in {1..3};do
		ping -c1 $IP$i > /dev/null
		if [ $? -eq 0 ];then
			echo $IP$i 连接成功!
			break
		fi
		echo $IP$i 尝试连接${j}次失败!
	done	
	 }&
done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值