前言
在进行linux系统维护时,重复性输入和交互式操作费时费力,可以通过编写shell脚本批量处理、自动化的完成一系列任务,减轻负担,shell多用于自动化部署、系统巡检和日志分割
一、编写shell
1、格式和运行
查看系统shell
cat /etc/shells
创建简单shell
[root@pc1 ~] vi shell.sh
添加如下内容
#!/bin/bash
echo "home目录下有以下文件"
cd /home
ls
echo "当前目录位置"
cd -
以下三种方法可运行shell
./文件 需要执行权限(chmod +x 文件)
sh 文件或/bin/bash 文件或bash 文件
source 文件或. 文件
2、操作符号
< 从指定文件读取数据
> 将shell脚本正确信息运行后输出结果保存到指定文件(覆盖)
>> 将shell脚本正确信息运行后输出结果保存到指定文件(追加)
2> 将shell脚本运行后其中的错误信息保存到指定文件(覆盖)
2>> 将shell脚本运行后其中的错误信息保存到指定文件(追加)
&> 将输出结果和错误信息保存到指定文件
3、当前变量
变量的作用
- 用来存放系统和用户需要使用的特定参数(值)
- 变量名:使用固定的名称,由系统预设或用户定义
- 变量值:能够根据用户设置、系统环境的变化而变化
变量的类型
- 自定义变量:由用户自己定义、修改和使用
- 特殊变量:环境变量,只读变量,位置变量,预定义变量
当前变量(重启或bash或切换shell或切换用户后失效)
变量名=变量值
echo $变量名 查看变量
echo $变量名1 $变量名2 查看多个变量readonly 变量名 设为只读变量
例
a=1.txt
touch $a相当于touch1.txtlq='ls -lash'
$lq相当于ls -lash
4、全局变量
全局变量(bash或切换shell或切换用户后仍生效,重启失效)
export a=1.txt
或
a=1.txt
export a
5、永久变量
永久变量
在/etc/profile文件内容中添加变量可永久生效[root@pc1 ~]# a=1.txt
echo "$a"
echo后面"$a"表示引用a的变量,输出结果为1.txt
echo '$a'
echo后面'$a'表示输出固定字符,输出结果为$a
echo `ls -la`或echo $(ls -la)
echo后面`ls -la`或$(ls -la)表示输出命令结果,相当于运行命令例
[root@pc1 ~] echo '$a'"$a"bc
$a1.txtbc
6、自定义变量
可自定义输入变量
[root@pc1 ~] read -p "提示信息" a
提示信息 1
[root@pc1 ~] echo $a
1
7、加法脚本
[root@pc1 ~]# vi shell.sh
#!/bin/bash
echo "加法运算"
read -p '第1个数:' a1
read -p '第2个数:' b
read -p '第3个数:' c
echo '结果:' `expr $a1 + $b + $c`[root@pc1 ~]# sh shell.sh
加法运算
第1个数:12
第2个数:12
第3个数:12
结果: 36
8、整数运算
加法
[root@pc1 ~] expr 1 + 2
3
减法
[root@pc1 ~] expr 10 - 7
3
乘法
[root@pc1 ~] expr 2 \* 5 (使用乘号时,必须用反斜线,因为默认*代表全部而不是乘号)
10
除法
[root@pc1 ~] expr 10 / 2 / 5
1
取除法余数
[root@pc1 ~] expr 5 % 3
2
9、系统变量
PWD 用户当前路径
PATH 系统的路径变量(可执行命令路径,即为命令执行时查找的路径范围)
USER 当前登录用户
SHELL 当前用户使用的shell环境
HOME 当前用户的宿主目录
10、位置参数与预定义变量
位置参数变量
$数字 数字范围0~9,代表第几个位置参数,$0为当前程序进程或文件的名称预定义变量
$# 命令行中位置变量个数
$* 所有位置变量的内容
$? 上一条命令执行后返回的状态,返回值为0表示执行正常,非0表示执行异常或出错
11、打包备份脚本
创建打包备份脚本
[root@pc1 ~]# vi shell.sh
添加如下内容
#!/bin/bash
a=beifen-`date +%F_%H·%M`.tar.gz
tar -zcf $a $* &> /root/3.txt
echo "已执行$0脚本"
echo "共完成$#个备份"
echo "具体内容包括:$*"使用脚本备份文件
[root@pc1 ~]# sh shell.sh 1.txt 2.txt
已执行shell.sh脚本
共完成2个备份
具体内容包括:1.txt 2.txt[root@pc1 ~]# ll
-rw-r--r-- 1 root root 147 2月 10 21:10 beifen-2022-02-10_21·10.tar.gz
12、测试操作
条件测试
[root@pc1 ~]# test 条件表达式或[ 条件表达式 ]
[root@pc1 ~]# echo $?
文件测试
[root@pc1 ~]# [ 操作符 文件或目录 ]常用的测试操作符
-d 测试是否为目录
-e 测试目录或文件是否存在
-f 测试是否为文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行[root@pc1 ~]# [ -d 文件 ]
[root@pc1 ~]# echo $?
1
[root@pc1 ~]# [ -d 目录 ]
[root@pc1 ~]# echo $?
0
13、整数值对比
[ 整数1 操作符 整数2 ]
常用的测试操作符
-eq 等于(Equal)
-ne 不等于(Not Equal)
-gt 大于(Greater Than)
-It 小于(Lesser Than)
-le 小于或等于(Lesser or Equal)
-ge 大于或等于(Greater or Equal)[root@pc1 ~]# [ 3 -eq 3 ]
[root@pc1 ~]# echo $?
0
[root@pc1 ~]# [ 3 -ne 3 ]
[root@pc1 ~]# echo $?
1[root@pc1 ~]# [ 1 -eq 2 ] || echo "budengyu"
budengyu
[root@pc1 ~]# [ 1 -eq 1 ] && echo "dengyu"
dengyu
[root@pc1 ~]# mem=`free -m|grep Men: | awk '{print $7}'`
[root@pc1 ~]# [ $mem -ge 1000 ]&&[ $mem -le 2000 ]&&echo 可用内存大于1000MB小于2000MB,当前内存为:"$mem"MB
可用内存大于1000MB小于2000MB,当前内存为:1182MB
等于
[ 数字1=数字2 ]不等于
[ 数字1!=数字2 ]字符串为空
[ -z 字符串 ]
14、操作符
在命令操作中
&& 表示前一条命令执行成功或正确时,才执行后一条命令
|| 表示上一条命令执行失败或错误后,才执行下一条命令在测试命令符中
-a或&& 与,两者都要满足
-o或|| 或,两者满足一个即可
! 非,不满足[root@pc1 ~]# ll
-rw-r--r-- 1 root root 0 2月 11 16:04 a
[root@pc1 ~]# [ ! -d a ]&&mkdir b 不存在目录a就创建目录b(通常是不能存在某个文件或目录就创建某个文件或目录)
[root@pc1 ~]# ll
-rw-r--r-- 1 root root 0 2月 11 16:04 a
drwxr-xr-x 2 root root 6 2月 11 16:06 b
二、分支语句
1、单分支if语句
如果目录/root/a不存在就创建目录/root/a
编辑shell内容如下
#!/bin/bash
a=/root/a
if [ ! -d $a ]
then mkdir $a
fi
2、双分支语句
else表示如果then不成立则
编辑shell内容如下
#!/bin/bash
read -p '是否安装(yes或no):' a
if [ $a = yes ]
then echo 安装成功
else echo 安装失败
fi
检测主机是否可ping通
编辑shell如下(ping -c表示发送测试包数量 -i表示间隔时间多少秒,-W表示超时时间多少秒)
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &>/dev/null
if [ $? -eq 0 ]
then echo 主机$1可以ping通
else echo 主机$1无法ping通
fi
检测服务端口是否开启
编辑shell如下
#!/bin/bash
netstat -naput|grep $1 &>/dev/null
if [ $? -eq 0 ]
then echo $1端口正在运行
else echo $1端口没有运行
fi
3、多分支语句
elif表示否则如果
编辑shell如下
#!/bin/bash
read -p '输入分数:' a
if [ $a = 100 ]
then echo 满分
elif [ $a -le 99 ]&&[ $a -ge 80 ]
then echo 优秀
elif [ $a -le 79 ]&&[ $a -ge 60 ]
then echo 及格
elif [ $a -le 59 ]&&[ $a -ge 0 ]
then echo 不及格
else echo 输入错误,请输入0~100数值
fi
4、case格式多分支语句
编辑shell如下,129~131可以表示为129|13[0-1]),字母可以表示为[a-z][A-Z])
#!/bin/bash
read -p '输入分数:' a
case $a in
100)
echo 满分
;;
[8-9][0-9])
echo 优秀
;;
[6-7][0-9])
echo 合格
;;
[0-5][0-9])
echo 不合格
;;
0)
echo 不合格
;;
*)
echo 请输入0~100
;;
esac
结语
一个合格的shell脚本应该遵循标准的脚本结构,能够给出友好的提示信息,更加容易读懂,对于代码较多、结构复杂的脚本,应该添加必要的注释文字
版权声明:本文为博主「1风天云月」的原创文章,版权归原作者所有。
阿里云链接:https://developer.aliyun.com/article/871880
CSDN链接:https://blog.csdn.net/le616616/article/details/122908704