shell脚本简单总结

shell脚本
一个文件一旦拥有了X权限,就是一个程序,因此,脚本就是程序,以进程的方式运行在内存中
shell脚本的意义在于,通过命令行解析的方式,帮我们自动去执行设定好的命令代码。
假如把脚本挂到定时任务里,那就是自动在某个没有人的时间里自动触发程序。
shell脚本的构成
文件名
一般脚本文件的名字要以.sh结尾,代表shell的意思。用以区分脚本和普通文件
脚本声明
#!代表声明
脚本文件的第一行必须要写#!/bin/bash
#!/bin/env bash是用env查找器去找bash
utf-8是支持简体中文、utf-16支持繁体中文
coding:
注释信息
用来描述脚本的作用
脚本的执行内容
shell脚本的写法规范
脚本里的命令必须都是非交互的,或者说是在脚本的执行过程中不能出现交互式的画面,以免影响脚本的正常执行。
脚本文件一般放在/server/scripts里
如果需要写路径,要把路径赋给变量
exit退出后面要加返回码,在脚本最后写exit 0,执行结束后通过$?查看返回码,在开头写入错误返回码的注释
还要考虑可以执行脚本的用户
免交互创建账号
useradd 用户名
echo “密码内容” | passwd --stdin 用户名
变量
如果变量是字符串的情况下,想取变量的内容,后加字符进行拼接,要用大括号进行区分
echo {变量名}拼接的字符串
shell脚本的执行方式
sh或者bash后加脚本文件名执行
以脚本的相对路径执行,需要有X权限 ./脚本名
以脚本的绝对路径执行,但是脚本文件必须要有x执行权限
chmod u+x 文件或目录名 是只给属主位加x权限
chmod +x 文件或目录名 如果没有限定默认主组它都加x权限
限制允许执行脚本的用户
用whoami命令查看当前用户,来判断执行脚本的用户,以此来限制允许执行脚本的用户
test和 [ ] 脚本里的判断方法
test条件表达式
[ 条件表达式 ](常用,[]两边需要有空格)
每种判断都可通过echo $?进行成功与否的取值,0代表判断正确,非0代表判断错误
条件测试
-d 测试是否为目录
-f 测试是否为文件
-e 测试文件或目录是否存在
-r 测试当前用户是否可读
-w 测试当前用户是否可写
-x 测试当前用户是否可执行
-s 测试文件大小非0时为真(若不是空文件,则为真)
-u 测试是否具有SUID属性
-g 测试是否具有SGID属性
-k 测试是否具有stick bit粘滞位属性
-nt 测试第一个文件是否比第二个文件新
-ot 测试第一个文件是否比第二个文件旧
-ef 测试第一个文件是否与第二个文件为同一个文件(link链接之类的文件)
字符串测试
[字符串1 == 字符串2] 为字符串内容相同
[字符串1 !== 字符串2] 为字符串内容不相同
[ -z 字符串 ] 为字符串内容为空,或者变量的值为空,但是不能判断空格,空格也会被当成字符
求变量的位数(也可用于判断字符串是否为空)
echo ${#变量名} 输出为变量的字符位数
逻辑测试
-a:并且的意思
-o:或者的意思
!:逻辑否
&&逻辑与和||逻辑或的用法
&&是左边命令执行成功后(判断为0)才能执行右边的命令,否则右边不执行
||是左边命令执行失败后(判断非0)才能执行右边的命令,否则右边不执行
也可以两个同时写,左边命令执行成功就执行&&右边的命令,如果执行不成功就执行||右边的命令。
如果||后面还需要加&&则用()来实现,把右边的命令强行并成一个
read命令实现脚本的交互式输入
read 后加变量 ——进行交互式输入
read -p “文本提示” 变量 ——在进行交互式输入时屏幕输出文本提示的内容

整数测试参数
-gt(great than)是大于
-lt(less that)是小于
-eq是等于
-ge是大于等于
-le是小于等于
位置变量,参数传递的方式进行交互
执行脚本的时候,后面空格加上字符之后,就叫参数,脚本与参数,参数与参数之间都用空格分隔
$#:脚本要处理的参数的个数
$*:横向罗列所有参数
$@:单个参数的组合
$?:保存着命令或脚本执行状态码
$0:脚本执行时的路径,如果以相对路径执行就是相对路径,绝对路径执行,就是绝对路径
$1:脚本要处理的第一个参数
2 9 使 2:脚本要处理的第二个参数,以此类推,最多可以直接处理9个参数 赋值可使用引号: 双引号:允许通过 符号引用其他变量,如果赋值的时候是赋值字符串,最好加上双引号
单引号:禁止引用其他变量, 视为普通字符 反引号:和 ()一样,提取命令的执行结果
数值计算
(( ))两个小括号中间的内容,代表用C语言的格式来解析
例:
for ((i=0;i<10;i++))
do
echo $i
done
如果中间没有i<10的限定,就可以无限循环
开启计算的方法
$[ ]直接开启计算
expr $x + $y shell脚本里的一种计算方法
if条件判断
if:如果的意思,也作为一个条件判断的开始
then:那么的意思,在if的条件后面加;then,和if是如果……就……的关系,
elif:多条件语句,否则如果的意思,如果上面的条件不成立,就匹配下面的条件,条件2
else:否则那么的意思,和if是如果……不成立,就……的关系,也就是如果上面的条件都不成立,则执行……的意思
fi:条件判断的结束
exit:强行终止脚本的运行,在脚本里运行命令遇到exit就会强行终止脚本
单分支
只有一个条件的情况下为单分支
多分支
有多个条件的情况下为多分支
多分支里条件是从上到下,如果符合条件一,则不再考虑条件二,以此类推,所以上面的条件不能涵盖下面的条件
一个TAB在shell里是8个空格,缩进
在脚本里写配置文件的方法
用输入重定向的方法,也可以追加输入重定向
cat > 文件名 << 结尾标识
dirname 取文件的路径

basename 取文件的名字

sleep:休息命令,可以控制循环的速度,后加1为一秒后再进入下次循环
clear:清屏命令,一旦执行,屏幕就会刷新
shell脚本的循环语句
for循环
作用:读取不同的变量值,以逐个执行同一组命令
语句结构
在这里插入图片描述
for:作为开头
do:具体执行做什么
do和done之间的内容作为循环体
done:作为结束
例如:for i in $*取后面输出的参数项
for i in seq 10
for i in {1…10}
for i in 1 3 5 7

while循环
作用:重复测试某个条件,只要条件成立则反复执行
语句结构
在这里插入图片描述
while:作为开始
后面加条件,符合条件进入循环,如果不符合条件则跳出循环。如果不需要条件,以一个:结尾表示没有条件,则进入无限循环
do:循环体
done:作为结束

case语句
用于没有优先级关系的条件下,所有条件都是平级,结构清晰。一般用来写服务的启动脚本和选择性菜单
写服务的格式
可以通过引用/etc/init.d/function
action命令 后加true或者false

语句结构
在这里插入图片描述
函数
不管什么编程语言,基本只有三种编程方法:
面向过程
面向对象
函数式编程
这三种模式,并不是语法,而是教我们如何去编写代码的方法论
在shell这种语言里,只能支持面向过程这种编程方法,面向过程就是按照一定的顺序,进行代码的编写,不能跳步,这就是面向过程的方法
函数结构:
(function可以没有) 函数名(){函数体的内容}
函数的名字最好至少一个字母大写,避免发生冲突,出现误调用的情况
函数体只有被调用的时候才会执行函数里面的代码,如果函数体外部没有任何一个地方调用此函数体的话,函数体是不会执行的
写一遍函数体的名字即为调用此函数体,每写一遍即为调用一遍,写多少遍,调用多少遍
函数体内传递参数
在调用函数的后面加上参数,在执行脚本的时候后面加上对应的参数
四种循环控制语句
break:触发后,强行跳出本次一个循环体(for或者是while),也就是终止当前循环体,但不能跳出上级循环体,更不能终止脚本,当前循环体外的正常运行
continue:触发后,终止当前本次循环,直接进入下次循环,只是终止当前一次循环,并没有终止循环体
exit:一旦触发运行,强行终止脚本
return:针对函数的循环,触发后,跳出整个函数体,回到调用函数体的位置,但不影响函数体外的脚本运行
调试脚本
sh -x :后加脚本名,跟踪脚本,查看脚本的运行过程,将执行的脚本内容以及输出显示到屏幕

nohup命令,防止命令或脚本执行中断
执行命令前面加nohup命令,确保命令程序或者脚本的持续运行,哪怕执行的用户掉线也会持续运行,会生成一个名为nohup的文件,执行结果会持续输出到文件里
$RANDOM随机数
$RANDOM会随机生成4位到6位的随机数
R A N D O M m d 5 s u m RANDOM | md5sum随机数字和字母的组合, RANDOM | md5sum | cut -c 1-7取随机字母数字组合的1到7位
(( R A N D O M ( ( RANDOM%9))生成0-9的随机数 (( RANDOM%9)) ( ( (( RANDOM%9))生成0-99的随机数

猜你喜欢

转载自blog.csdn.net/weixin_43880933/article/details/88602294