目录
Shell
shell的作用
Shell 是一种命令行界面和脚本语言,用于在操作系统中与计算机进行交互和自动化任务。
- 与计算机交互: 通过命令行输入命令,执行操作,管理文件和目录等。
- 自动化任务: 编写脚本来自动完成重复性任务,比如备份文件、定时运行任务等。
- 系统管理: 用于管理和配置计算机系统,安装软件,监控系统状态等。
- 文本处理: 处理文本文件,搜索、替换、提取信息等。
- 网络操作: 通过命令行进行网络连接、数据传输、下载文件等。
- 环境配置: 设置环境变量,定义别名,使工作环境更加适合个人需求。
- 启动和停止程序: 用于启动、停止和管理程序和服务。
- 调用系统命令: 可以调用系统内置的命令和工具,进行各种操作。
shell脚本
Shell脚本的确是一种按顺序执行命令的程序,它可以将简单的命令和操作组合在一起,实现自动化的任务执行,提高工作效率。同时,你也提到了Shell脚本的处理逻辑,包括顺序执行、选择执行和循环执行,这些是编写Shell脚本时常用的逻辑结构。
Shell脚本:
就是将命令按顺序一一列出的程序,最后自动执行。shell脚本将简单的命令组合完成负责的工作,自动化执行命令,提高工作效率,可以用于日常性重复性的运维工作。
处理逻辑:
顺序执行:程序按从上到下的顺序执行
选择执行:程序执行过程中,根据条件的不同选择不同的分支继续执行
循环执行:程序在执行过程中需要重复执行多次某些语句(根据已知次数、已知条件)
shell脚本基本格式
#!/bin/bash
#上面这一行是脚本的shebang,指定要使用的Shell解释器
#注释:用于解释脚本的目的、功能等
#你可以在这里写注释,以及在脚本的其他部分添加注释
#命令部分:
#这里写下你需要执行的命令和操作
#每一行都是一个命令,可以包括参数和选项
#脚本结束
-
#!/bin/bash:这一行是脚本的shebang,它指定了脚本要使用的Shell解释器,这里使用的是Bash。不同的Shell解释器可能会有不同的语法和特性。
-
注释:用 # 符号开头,用于解释脚本的目的、功能、作者等。注释对脚本的执行没有影响,但对于脚本的可读性和维护非常重要。
-
命令部分:这里写下你需要执行的命令和操作,每一行都是一个命令,可以包括命令的参数和选项。你可以根据实际需求编写任意数量的命令。
-
脚本结束:脚本的正文部分结束后,脚本就会执行完毕。
当你编写好脚本后,可以通过终端运行它,例如:
chmod +x your_script.sh # 添加执行权限
./your_script.sh # 运行脚本
shell脚本执行方式
直接运行:在终端中直接输入脚本的文件路径并按回车键执行。
./your_script.sh #这种方式需要脚本文件有可执行权限,且脚本的 shebang 行正确指定了解释器。
/data/your_script.sh #绝对路径
通过解释器运行:使用解释器执行脚本,适用于没有添加可执行权限的脚本文件。
bash your_script.sh
sh your_script.sh
作为子进程运行:在命令前加上 bash -c 或 sh -c,将脚本作为子进程运行。
bash -c "./your_script.sh"
sh -c "./your_script.sh"
在终端中逐行运行:将脚本中的命令逐行在终端中输入执行。
通过其他程序调用:可以将脚本作为其他程序的一部分,通过调用这个程序来执行脚本。
在执行脚本时,还可以传递参数给脚本,以便在脚本内部使用。例如:
./your_script.sh arg1 arg2 #在脚本内部,你可以使用 $1、$2 等来引用传递的参数。
bash -n 脚本名称 (绝对路径) # 检查语法错误
bash -x 脚本名称 (绝对路径) # 检查逻辑错误
Shell脚本的变量
变量赋值:
引用变量:
my_var="Hello, World!"
echo $my_var
变量命名规则:
变量名只能包含字母、数字和下划线(_),不能以数字开头。
避免使用Shell保留关键字,如if、else、for等作为变量名。
变量名区分大小写。
特殊变量:
- $0:脚本名称。
- $1、$2、…:脚本的参数,如 $1 表示第一个参数。
- $#:传递给脚本的参数数量。
- $* 或 $@:所有参数。
- $?:上一个命令的退出状态(0 表示成功,非零表示失败)。
- $$:当前脚本的进程ID。
- $USER 或 $LOGNAME:当前用户的用户名。
脚本
#!/bin/bash
name="Alice"
age=30
echo "My name is $name."
echo "I am $age years old."
#计算两个数字之和
num1=10
num2=20
sum=$((num1 + num2))
echo "Sum: $sum"
执行结果
My name is Alice.
I am 30 years old.
Sum: 30
注意:
- 变量赋值时不能有空格,如 name = “Alice” 是无效的。
- readonly name 设置为只读变量 ;只读变量不能删除
- $1-$9:脚本后1-9的位置
${10}:脚本后10以上的位置需要借助变量分隔符{},不然会将$1认为是一个位置变量然后输出再加上后面的数字。
测试和操作符
测试的格式
格式1:test 条件表达式
格式2:[ 条件表达式 ] || [ 操作符 文件或目录 ]
[[ ]]加强版[ ],测试支持通配符和正则表达式
测试的选项(操作符)
-
-d 测试是否为文件夹
-
-f 测试是否为普通文件
-
-e 测试文件或目录是否存在
-
-a 测试文件或目录是否存在,不建议使用此选项。取反!=时echo $?是错误的返回值。
-
-L 测试是否为软连接文件
-
-r 判断当前用户是否有读权限,根据实际情况返回结果,不是按ll显示的文件属性权限。
-
-w 判断当前用户是否有写权限,根据实际情况返回结果,不是ll显示的文件属性权限。
-
-x 判断当前用户是否有可执行权限,根据实际情况返回结果,root账户时其他用户有执行权限root账户也有,若其他账户没有执行权限则root也没有。
[root@test1 ~]# [ -d /etc/sysconfig/ ]
[root@test1 ~]# echo $?
0
[root@test1 ~]# [ -f /etc/sysconfig/ ]
[root@test1 ~]# echo $?
1
[root@localhost ~]# test -e qiuhe.sh &&echo "yes"
yes
注意前后空格
比较数值的操作符
[ 整数1 操作符 整数2 ] 公式
- -eq:第一个数等于(Equal)第二个数
- -ne:第一个数不等于(Not Equal)第二个数
- -gt:第一个数大于(Greater Than)第二个数
- -lt:第一个数小于(Lesser Than)第二个数
- -le:第一个数小于或等于(Lesser or Equal)第二个数
- -ge:第一个数大于或等于(Greater or Equal)第二个数
比较字符串的操作符
- =:字符串内容相同
- !=:字符串内容不同,! 号表示相反的意思
- -z:字符串内容为空
- -n: 字符是否存在
[ 字符串1 = 字符串2 ] 是否相同
[ 字符串1 != 字符串2 ] 是否不相同
[ -z 字符串 ] 是否为空
[ -n 字符串 ] 字符是否存在
#str1=wang
#str2=zhou
#[ $str1 = $str2 ]
#echo $?
1
#[ $USER = root ]&& echo true
true
#[ $USER != root ]&& echo true
逻辑操作符
格式1:[ 表达式1 ] 操作符 [ 表达式2 ]
格式2:命令1 操作符 命令2
操作符:
-
&&或-a 表示且的意思,前面表达式或命令1为真才会执行操作符后面的表达式2或命令2。一假则为假。
-
||或-o 表示或的意思,前面表达式1或命令1为真则整个表达式为真,前面表达式为假或命令为假才会执行后面的表达式2或命令2 。一真则为真。
-
! 逻辑否。
相关语句
if语句
if [条件判断]
then (条件1成立则走then)
[执行命令]
elif [条件判断2 ] (可添加多个elif )
then (条件2成立则走then)
[执行命令]
else (所有条件不成立则走else)
[执行命令]
fi (if结束语句)
#!/bin/bash
yum install httpd -y &>/dev/null
ss -natp |grep ':80' &>/dev/null
if [ $? -eq 0 ]; then
echo "httpd服务已启动"
else
systemctl start httpd
if [ $? -eq 0 ]; then
echo "启动成功"
else
echo "启动失败"
fi
fi
case语句
case 变量 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
模式3)
命令序列3
;;
*)
默认命令序列
;;
esac
- 变量 是需要测试的变量。
- 模式1、模式2、模式3 等是用来匹配的模式。
- 命令序列1、命令序列2、命令序列3 是在匹配对应模式时执行的命令。 * 是一个通配符,用于匹配所有未被前面模式匹配的情况。
- esac 是 case 语句的结束标记。
#!/bin/bash
read -p "请输入一个数字: " num
case $num in
1)
echo "你输入了数字 1"
;;
2)
echo "你输入了数字 2"
;;
3|4|5)
echo "你输入了数字 3、4 或 5"
;;
*)
echo "你输入了其他数字"
;;
esac
脚本常用命令
cut
cut命令:提取想要的信息。
选项:
-d 指定分隔符 例如 cut -d ":"指定:为分隔符。
-f 选择第几列 例如 cut -f3 取第三列,-f1,3取第1列和第三列,-f1-3取1-3列。
sort
sort命令:排序
选项:
-r 执行反方向(由上至下)整理
-n 按数字大小排序,默认第一列默认按字母顺序
-t 指定分隔符
-k 指定列 ,例如 -k3
cal
cal命令:显示当月日历。
选项:
cal 12 显示本年整年日历
cal 某年 显示此年完整日历
data
date命令:查看时间,显示格式为,星期 月 日 时分秒 年
选项:
+%F 输出格式年-月-日,注意%在crontab定时中不能直接使用,需要转义
+%T 输出格式时:分:秒, 注意%在crontab定时中不能直接使用,需要转义
#!/bin/bash
use=`df -h|tr -s ' '|cut -d ' ' -f5|tail -n +2|tr -d %|sort -rn|head -n 1`
[ $use -gt 80 ] && echo "disk will be full,please check it" || echo "磁盘正常"