🍁博主简介
🏅云计算领域优质创作者
🏅华为云开发者社区专家博主
🏅阿里云开发者社区专家博主
💊交流社区:运维交流社区 欢迎大家的加入!
文章目录
shell脚本简介
shell 用户与内核沟通的桥梁
shell的分类:
- 第一类:bash sh csh
- 第二类:ksh
shell脚本的好处:
将命令按照一定顺序保存到文件中,统一执行
- 解决重复性的工作
- 可以避免一些低级错误
一些语言的脚本后缀
- perl–>.pl
- python–>.py
- php–>.php
- shell–>.sh
编程语言分类:
- 编译型 C C++
- 解释型 python shell php
- 面向对象 python java C++
- 面向过程 shell C
- 静态语言:java C
- 动态语言:shell python
- 强类型:java python
- 弱类型:shell C
shell脚本的固定书写
- 创建shell脚本
#直接进入并写脚本,会自动创建vim first.sh
#手动创建touch first.sh
- #!/bin/bash–>幻数,指定解释器,在每次的shell脚本中的最顶行写
为注释符
- echo “Hello world!” 可执行代码,输出Hello world!
如何执行shell脚本
- bash 文件名或着sh 文件名直接执行脚本,此时不需要加执行权限(bash first.sh/sh first.sh)
bash first.sh
&&sh first.sh
- 相对路径或绝对路径执行脚本,此时必须加执行权限(./first.sh)
./first.sh
- source执行 在当前shell下执行脚本(source first.sh)
source first.sh
推荐使用
sh first.sh
。
shell脚本变量
变量:用字符串表示一个值,用于存储值的位置,这个字符串叫变量名
定义变量:变量名=变量值 python=$(ps -ef | grep -v grep | grep python | wc -l)
调用变量:$变量名 echo $python
删除变量:unset 变量名 unset &python在shell调用一个未赋值的变量,不会报错,会返回空值;
- 变量是临时保存在内存中
- set 查看系统所有的变量
变量的命名规则:
- 1.变量名要有意义。不要使用a,b,c
- 2.可以采用驼峰式命名或_隔开的方式
- 3.命名时应该避开系统的关键字
- 4.对于常量采用全部大写表示
shell中变量的分类:
- 预定义变量
- 位置变量
- 环境变量
- 自定义变量
预定义变量:shell中预先设置好的变量,可以直接调用
举例:
就比如我定义一个变量是查找python的进程数量
pyj=$(ps -ef | grep -v grep | grep python | wc -l)
调用的时候这样调用echo $pyj
位置变量:脚本传递的位置参数,默认可以使用$1-$9,不交互传参
- $0 保存脚本执行的路径
- $# 保存脚本处理的 参数个数
- $* 保存脚本处理的所有参数,把参数作为整体进行保存
- $@ 保存脚本处理的所有参数,把参数作为个体进行保存
- $$ 保存脚本的PID
- $? 保存上一条命令执行的状态0代表成功,其他代表不成功(常用)
- $_ 保存上一条命令的参数
环境变量:
env 查看系统环境变量
自定义变量:默认直在当前shell生效,如果想在其新打开的shell下也生效,可以使用export将变量导出
export 变量名=变量值
变量名=变量值,export变量名/etc/bashrc
/etc/profile~/.bashrc
~/.bash_profile当打开终端时,会默认去读取系统中环境变量设置的文件 /etc/profile
shell脚本的计算
(( )) 只能做整数计算
- +加
- -减
- *乘
- /除
- %余
- 2**5二的五次方
实例:
#!/bin/bash#加法jia=$((1+1))echo$jia#减法jian=$((5-2))echo$jian#乘法cheng=$((3*3))echo$cheng#除法chu=$((18/3))echo$chu#余数yu=$((13%2))echo$yu#2的3次方ci=$((2**5))echo$ci
结果为:
[root@cs ~]# sh cs.sh2396132
[]只能做整数计算(和(())一样)
实例:
#!/bin/bashabc=$[1 + 4]echo$abc
结果为:
5
expr 只能做整数计算(可用于判断是否为整数)
加、减、乘、除、余、次方都可以
使用expr来做计算,计算单位前后都要加空格
#!/bin/bashexpr10 + 20
结果为:30
也可以用来判断以上结果是否为整数;实例:
(这个可以先看看,后面会教if判断的。)
#!/bin/bash#交互方式输入数字read -p "please input is number:" number
#判断是否为整数expr10 + $number&>/dev/null
#如果为整数就会返回0,如果不是会返回其他,并打印出来。if[$? -ne 0];thenecho"${number}不是合法整数"exit1elseecho"${number}是整数"fi
bc 计算器(可小数点)
echo"3+5"|bc 不交互计算=8#2为要保留的小数点位数echo"scale=2;3/5"|bc 保留两位小数=.60
let 整数计算,与(( ))一样
原本a=10,let a++ ,在执行一次ehco $a就=11了
#!/bin/basha=10let a++
echo$a
结果为11
主要用于while循环中,变量自增赋值# shell脚本的内置命令
内置命令
echo
echo 将指定内容输出到屏幕上,通常打印变量值,默认是换行打印
echo 参数:
- -n 不换行打印
- -e 解释转义字符
(这两个用于echo之后,输出文字之前使用,例如:echo -e “\e[5;44;30mabcabc\e[0m”)
常见的转义字符:
- \a 响铃
- \n 换行
- \r 回车
- \t 水平制表符(tab)
- \v 垂直制表符
- \b 删除前一个字符
(用于输出文字内使用,例如:echo -e "123\n332"换行)
单引号和双引号的区别:
- 单引号:所见即所得(意思是:看到的是什么,输出的就是什么);
- 双引号:可以解释$引用的变量
( ) 等于 ‘ ˋ 优先执行里面的指令,一般用于设置变量 p y j = ()等于 \`` 优先执行里面的指令,一般用于设置变量 pyj= ()等于‘ˋ优先执行里面的指令,一般用于设置变量pyj=(ps -ef | grep -v grep | grep python | wc -l)
pyj2=
ps -ef | grep -v grep | grep python | wc -l
利用echo输出带颜色的内容:
#使用方法echo -e "\e[字体控制颜色;字体背景颜色;文字颜色m 字符串\e[0m"#实例:(输出一个闪烁的;字体背景颜色为蓝色;字体颜色为黑色的abcabc)echo -e "\e[5;44;30mabcabc\e[0m"#输出一个字体颜色为绿色的abcabcecho -e "\e[32mabcabc\e[0m"
常见的字体颜色:重置=0,黑色=30m,红色=31m,绿色=32m,黄色=33m,蓝色=34m,紫色=35m,天蓝色=36,白色=37m。
常见的背景颜色:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,紫色=45,天蓝色=46,白色=47。
字体控制选项:1表示高亮,4表示下划线,5表示闪烁等。
注:因为需要使用特殊符号,所以需要配合-e选项来识别特殊符号。
echo 注意事项:
在使用echo命令时,如果输出内容中含有!,不可以使用双引号,只可以使用单引号,因为默认!的作用是调用历史命令记录,除非使用set +H关闭历史命令引用。
set +H 关闭历史命令引用
read
read命令 从标准输入读取内容
read命令参数:
- -p 打印提示
- -t 指定超时时间
- -s 不显示屏幕输入的内容(主要用于输入密码之类的)
在firest.sh中写
例如:
#提示请输入您的姓名:输入完成之后回车即可,该name变量可在其他地方调用read -p "请输入您的姓名:" name
echo$name#提示请输入您的姓名,五秒之内不输入就会自动退出会话,输入完成之后回车即可,该name变量可在其他地方调用read -t 5 -p "请输入您的姓名:" name
echo$name#提示请输入您的姓名,五秒之内不输入就会自动退出会话,输入的时候不显示你输入的内容,输入完成之后回车即可,该name变量可在其他地方调用read -t 5 -s -p "请输入您的姓名:" name
echo$name
如果read后没有指定变量名,默认会将参数值传递给REPLY
shell脚本流程控制语句
条件测试(前后都要有空格)
test 条件 或 [ 条件 ]
test anaconda-ks.cfg
[ -f anaconda-ks.cfg ]
文件测试([]前后都要有空格)
- -f 判断是否为文件
[ -f anaconda-ks.cfg ]
- -d 判断是否是目录
[ -d /dir1 ]
- -e 判断文件或目录是否存在
[ -e anaconda-ks.cfg ]
- -b 判断是否为设备文件
[ -b anaconda-ks.cfg ]
- -l 判断是否为链接文件
[ -l anaconda-ks.cfg ]
- -e 判断一个文件是否为空文件
[ -e anaconda-ks.cfg ]
整数测试(常用于if判断中)
- -eq 等于
- -ne 不等于
- -gt 大于
- -lt 小于
- -ge 大于等于
- -le 小于等于
(( )) 可以直接使用符号比较大小
#等于1if[$a -eq 1]#不等于1if[$a -ne 1]#大于1if[$a -gt 1]#小于1if[$a -lt 1]#大于等于1if[$a -ge 1]#小于等于1if[$a -le 1]
字符串测试(常用于if判断中)
- == 等于
- != 不等于
- -z 判断字符串是否为空
#等于“测试”if["$a"=="测试"]#不等于“测试”if["$a"!="测试"]#判断$a参数是否为空if[ -z "$a"]
逻辑关系
- && 与/并且
- || 或
- ! 非
#判断1不等于1,成立输出0,不成立输出1[1 -ne 1]&&echo0||echo1
shell中字符串操作
求变量字符串长度:
- 1.echo ${#变量名}
#!/bin/basha=12345678echo${#a}
输出结果为:8
- 2.echo $变量名 | wc -L
#!/bin/basha=12345678echo$a|wc -L
输出结果为:8
- 3.expr length $变量名
#!/bin/basha=12345678expr length $a
输出结果为:8
- 4.echo $变量名 | awk ‘{print length($0)}’
#!/bin/basha=12345678echo$a|awk'{print length($0)}'
输出结果为:8
变量字符串的截取:
- echo ${变量名:3} 截取字符串的前三个丢弃
#!/bin/basha=12345678echo${a:3}
结果为:45678
- echo ${变量名:3:2} 截取字符串的前三个丢弃,后面只要两个字符串,其余都不要了
#!/bin/basha=AAABBBCCC123aaabbbccc
echo${a:3:2}
结果为:BB
- echo ${变量名#A*C} 截取字符串的第一个A到第一个C(包含C)并丢弃;从头开始,最少匹配删除
#!/bin/basha=AAABBBCCC123aaabbbccc
echo${a#A*C}
结果为:CC123aaabbbccc
- echo ${变量名##A*C} 截取字符串的第一个A到最后一个C(包含C)并丢弃;从头开始,最多匹配删除
#!/bin/basha=AAABBBCCC123aaabbbccc
echo${a##A*C}
结果为:123aaabbbccc
- echo ${变量名%b*c} 截取字符串的最后一个b到最后一个c(包含c)并丢弃;从结尾开始,最少匹配删除
#!/bin/basha=AAABBBCCC123aaabbbccc
echo${a%b*c}
结果为:AAABBBCCC123aaabb
- echo ${变量名%%C*c} 截取字符串的最第一个C到最后一个c(包含c)并丢弃;从结尾开始,最多匹配删除
#!/bin/basha=AAABBBCCC123aaabbbccc
echo${a%%C*c}
结果为:AAABBB
变量字符串的替换:
- echo ${变量名/A/a} 将变量内容匹配的第一个字符替换
echo ${变量/old/new}
#!/bin/basha=AAABBBCCC123aaabbbccc
echo${a/C/c}
结果为:AAABBBcCC123aaabbbccc
- ehco ${变量名//A/a] 将变量内容匹配的所有字符替换
echo ${变量//old/new}
#!/bin/basha=AAABBBCCC123aaabbbccc
echo${a//C/c}
结果为:AAABBBccc123aaabbbccc
cut字符串切割
- -d 自定义分隔符
- -f 与-d一起使用,指定显示那个区域
echo"192.168.2.10"|cut -d "." -f 1#结果为192echo"192.168.2.10"|cut -d "." -f 2#结果为168echo"192.168.2.10"|cut -d "." -f 3#结果为2echo"192.168.2.10"|cut -d "." -f 4#结果为10
shell脚本数组
定义数组:
array=(值1 值2 值3)
实例:
#!/bin/basharray=(xiaoming xiaohong xiaolan)
数组的增删改查:
查:
- echo ${array[*]}或者echo ${array[@]} 打印数组中所有的值
#!/bin/basharray=(xiaoming xiaohong xiaolan)echo${array[*]}echo${array[@]}
结果为:
xiaoming xiaohong xiaolan
xiaoming xiaohong xiaolan
- echo ${array[1]} 打印数组中指定的值
注意:数组是从0开始算的;
#!/bin/basharray=(xiaoming xiaohong xiaolan)echo${array[0]}echo${array[1]}echo${array[2]}
结果为:
xiaoming
xiaohong
xiaolan
- echo ${#array[*]} 求数组的长度
- echo ${#array[@]} 求数组的长度
#!/bin/basharray=(xiaoming xiaohong xiaolan)echo${#array[*]}echo${#array[@]}
结果为:
3
3
- echo ${#array[1]} 求数组中的某一个字符串的长度
#!/bin/basharray=(xiaoming xiaohong xiaolan)echo${#array[0]}echo${#array[1]}echo${#array[2]}
结果为:
8
8
7
增:
array[3]=xiaohuang 给指定的位置加一个值
#!/bin/basharray=(xiaoming xiaohong xiaolan)
array[3]=xiaohuang
echo${array[3]}echo${array[*]}
结果为:
xiaohuang
xiaoming xiaohong xiaolan xiaohuang
改:
array[3]=xiaocheng 如果脚标对应位置有值,就修改;脚标可以不是数字array[脚标]
#!/bin/basharray=(xiaoming xiaohong xiaolan)
array[2]=xiaohei
echo${array[2]}echo${array[*]}
结果为:
xiaohei
xiaoming xiaohong xiaohei
删:
unset array 删除指定数组(array数组名称)
unset array[3] 删除指定位置的值
#!/bin/basharray=(xiaoming xiaohong xiaolan)#修改第二个姓名
array[2]=xiaohei
#删除第三个姓名unset array[2]echo${array[2]}echo${array[*]}
结果为:
空
xiaoming xiaohong
相关文章:
文章名文章地址【Linux】 shell脚本的创建及使用 《入门到实践》详解[⭐建议收藏!!⭐]https://liucy.blog.csdn.net/article/details/130111812【Linux】Shell脚本之函数的操作+实战详解[⭐建议收藏!!⭐]https://liucy.blog.csdn.net/article/details/130387377【Linux】Shell脚本之 if判断、case判断、for循环、while循环 + 实战详解[⭐建议收藏!!⭐]https://liucy.blog.csdn.net/article/details/130387523
版权归原作者 A-刘晨阳 所有, 如有侵权,请联系我们删除。