(超详细)Linux Shell 编程
Shell的定义
Shell是一个命令解释器,它的作用是解释执行用户输入的命令及程序等。 用户每输入一条命令,Shell就执行一条。这种从键盘输入命令,就可以立即得到回应的对话方式,称为交互的方式。
当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行时,该程序文件就被称为Shell脚本。 在Shell脚本里内置了很多命令、语句及循环控制,然后将这些命令一次性执行完毕,这种通过文件执行脚本的方式称为非交互的方式。 Shell脚本语言很适合用于处理纯文本型的数据,而Linux系统中几乎所有的配置文件、日志文件,以及绝大对数的启动文件都是纯文本类型的文件。
[root@localhost ~]# cat /etc/shells
/bin/sh (指向/bin/bash)
/bin/bash (默认shell类型)
/usr/bin/sh
/usr/bin/bash
shell脚本:
关键字
Linux命令
shell自带命令
函数
控制语句
.sh 作为文件后缀,代表是shell脚本
/etc/profile ~/.bash_profile ~/.bashrc ~/etc/bashrc(以最后一个生效)
shell脚本类型:
脚本书写规范
#!/bin/bash
添加注释信息
#日期,#作者,#作用,#版本,#联系方式…
#Date:2022-6-12
#Author:
#Desc:
#Vers:
#Email:
文件名后缀 .sh
shell脚本执行:
shell脚本编写规范:
写shell脚本时,命令用反单引号括起来``
设置变量 name=upper(等号两边不能有空格)
成对的符号,建议一次性写完 () {} [] ’ ’ " " ``
对于流程控制语句,应一次性将格式写完,再添加内容。缩进最好空四个
if []then(注意缩进)fi
for do ...done
变量
变量赋值方法
变量名="值 "(=左右两边没有空格)
echo $变量名(进行输出)
对于环境变量:变量名大写
set命令:查看环境变量
env命令:查看全局变量
declare:用来做定义
unset NAME:取消变量/删除变量
eg :
# unset A 撤销变量 A
# readonly B=2 声明静态的变量 B=2 ,不能 unset
用户自定义只在set中有;env中没有
自定义环境变量
(仅在当前环境有效)
1、export 变量名=值
2、变量名=值;export 变量名
3、declare -x 变量名=值
赋值用= ; 相等用==
用户级环境变量
~/.bashrc
全局环境变量
/etc/profile
/etc/bashrc
/etc/profile.d:存放脚本
取消环境变量:unset 变量名
局部变量
变量名=值
变量名=‘值’
变量名=“值”
变量名=command
变量名=$(command)
变量数组
特殊变量
赋值时引号的作用:
- 双引号:允许通过$符号引用其他变量值
- 单引号:禁止引用其他变量值,$视为普通字符
- 反撇号:命令替换,提取命令执行后的输出结果 全局变量的定义方法 export 变量名
字符串变量:
数组:
获取数组元素:
位置变量!!!
$0 获取当前shell脚本文件名
$n (n>0) 代表参数值
$@ 代表命令行中所有的参数
$# 代表命令行中所有参数的个数
$* 代表命令行中所有的参数
$? 获取上一条命令执行的状态返回值 0代表成功,非0代表失败
$$ 获取当前shell的进程ID
$! 获取上一个后台程序的进程ID(后台运行的最后一个进程号)
$_ 获取上一条命令或者脚本的最后一个参数
命令变量传递用法
echo
-n
-e
\t 制表符
\v 垂直制表符
\n 换行符
\r 回车
\b 退格
read
read option 变量名
-t 等待事件
-p 提示信息
${parameter:-word} 变量为空或未赋值,用word代替
${parameter:=word} 变量为空或未赋值,把变量值设置为word
${parameter:?word} 变量为空或未赋值,把word当作报错信息
${parameter:+word} 变量为空或未赋值,什么都不做,否则替换为word
-d 定界符 遇到这个字母终止读取
-e 交互式
-n:字符限制
-r:搭配/ 换行,表示未终止
-s:输入时字符不回显
read交互式
运算符:
+ - * / % 加 减 乘 除 取余
++ –
** 幂运算(自己乘自己)
== !=
< <= > >=
= += -= *= /= %=
&& || ! 与 或 非
(())
let (let赋值表达式)
$[]
bc 交互式运行,Ctrl+c退出
expr (运算时,运算符号和数字之间要有空格)
declare
(())
((i=i+1))
i=((i+1))
((2>1&&1=1)) 0代表flase 1代表true
条件测试:
test测试表达式
[ 测试表达式 ] !!!注意中括号两边空格
[[ 测试表达式> ]]
(( 测试表达式 ))
整数二元比较操作符:
逻辑操作符:
文件测试:
-d 文件存在且为目录则为真
-f 文件存在且为普通文件则为真
-e 文件存在则为真
-r 文件存在且可读则为真
-s 文件存在且大小不为0则为真
-w 文件存在且可写则为真
-x 文件存在且可执行则为真
-L 文件存在且为链接文件则为真
f1 -nt f2 newer than f1比f2新则为真
f1 -ot f2 older than f1比f2旧则为真
字符串测试:
-n 长度不为0则为真
-z 长度为0则为真
“str1” = “str2” 两个字符串相等为真,等号两端需要有空格,字符串需要加引号
“str1” != “str2” 两个字符串不相等为真,等号两端需要有空格,字符串需要加引号
整数比较
[] test
-eq
-ne
-gt
-ge
-lt
-le
[[]] (())
== =
!=
>
>=
<
<=
练习题1:
1、
2、
练习题2:
编写一个计数器:(注意expr格式要求很严格)
练习题3:
编写shell脚本获取用户的输入,
1、当用户输入的内容是文件时,输出文件内容,如果文件是shell脚本,则判断是否有执行权限,没有则添加,有则直接执行
2、当用户输入的内容是目录时,则输出目录下的内容
3、当用户输入一个链接文件时,可以查看此链接文件
4、当用户输入的内容不在此系统中,则提示“您输入的文件或目录不存在!”
cut:数据剪切
-b:以字节进行切割
-c:以字符切割
-d:指定分割符
-f:搭配-d使用指定显示那个区域
练习题4:
case 条件判断语句
case条件语句相当于多分支的if/elif/else条件语句,但是它比这些条件语句看起来更规范更工整,常被应用于实现系统服务启动脚本等企业应用场景中。
case 变量 inone)命令
;;two)命令
;;*) #*代表剩下的其他的命令
esac
for循环语句
for 条件
do命令
done##或for 条件;do命令
done
(seq序列)
(遍历数组中元素)
while循环语句
while 条件
do命令
done
break、continue、exit 循环控制语句
break 、continue在条件语句及循环语句(for、while、if等)中用于控制程序走向;而exit则用于终止所有语句并退出当前脚本。
shell函数
Shell 函数定义的语法格式如下:
function name() {statements[return value]
}
说明:
function是 Shell 中的关键字,专门用来定义函数;
name是函数名;
statements是函数要执行的代码,也就是一组语句;
return value表示函数的返回值,其中 return 是 Shell 关键字,
专门用在函数中返回一个值;这一部分可以写也可以不写。
由{ }包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。
函数调用
调用 Shell 函数时可以给它传递参数,也可以不传递。如果不传递参数,直接给出函数名字即可:
name
如果传递参数,那么多个参数之间以空格分隔:
name param1 param2 param3
不管是哪种形式,函数名字后面都不需要带括号。
和其它编程语言不同的是,Shell 函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。
练习1、定义一个函数,计算所有参数的和:
#!/bin/bash
function getsum(){local sum=0
for n in $@
do((sum+=n))
done
return $sum
}
getsum 10 20 55 15 #调用函数并传递参数
echo $?
#$@表示函数的所有参数,$?表示函数的退出状态(返回值);
#此处我们借助 return 关键字将所有数字的和返回,并使用$?得到这个值,这种处理方案在其它编程语言中没有任何问题,
#但是在 Shell 中是非常错误的,Shell 函数的返回值和其它编程语言大有不同。
#函数返回值在调用该函数后通过 $? 来获得。
#local命令表示声明的变量是本地变量,多在函数内部使用
例子:(磁盘使用率)
Shell 输入/输出重定向
练习2、编写一个计算器(使用函数)
> #!/bin/bash
cat << EOF
———————————————————————
欢迎使用shell计算器
1、加法
2、减法
3、乘法
4、除法(除数不为0)
5、幂运算
6、退出
———————————————————————
EOF
function addition() {add=$((a+b))echo "a+b为:"$add
}
function subtraction() {sub=$((a-b))echo "a-b为:"$sub
}
function multiplication() {mul=$((a*b))echo "a*b为:"$mul
}
function division() {div=$((a/b))echo "a/b为:"$div
}
function mi_yunsuan() {mi=$((a**b))echo "a**b为;"$mi
}
while [[ True ]]
doread -p "请输入运算类型:" iread -p "请输入两个数进行计算:" a bcase $i in1)additioncontinue;;2)subtractioncontinue;;3)multiplicationcontinue;;4)divisioncontinue;;5)mi_yunsuancontinue;;6)echo "运算结束,退出!"breakesac
done
mail命令
查看有没有postfix,如果有的话进行卸载(yum remove postfix)
安装mail命令:yum -y install mailx
详细过程进入此链接
set from=13259011323@163.com #此处设置发件人的信息
set smtp=smtp.163.com #此处配置对应邮箱的stmp服务器
set smtp-auth-user=13259011323@163.com #此处配置发件人邮箱地址
set smtp-auth-password=TXFJCVVAQXORJNSR #客户端授权码,不是邮箱地址密码
set smtp-auth=login
注意:
[root@localhost tmp]# systemctl restart network #添加完DNS要重启网卡
[root@localhost ~]# echo "Content" | mail -s "Title" 1151939762@qq.com #发邮件
注意:
echo "发送的内容" | mail -s "标题" 发送的邮箱
(接近实战的shell)
检测CPU使用率、检测磁盘使用率、检测内存使用率
1、检测CPU使用率
top命令
使用压缩命令占满CPU,再执行top命令进行查看
下面命令会创建 CPU 负荷,方法是通过压缩随机数据并将结果发送到 /dev/null:
cat /dev/urandom | gzip -9 > /dev/null
cat /proc/stat
cpu利用率=(user_pass + system_pass)*100%/(user_pass + system_pass + idle_pass)
2、磁盘的使用率
df -h命令查看
3、内存的使用率
free -m
使用量除以总量 看百分比
(超详细)Linux Shell 编程相关推荐
- Linux Shell 编程学习总结
Shell 教程 Shell简介:什么是Shell,Shell命令的两种执行方式 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成 ...
- linux实验三shell程序设计,实验三 LINUX SHELL编程
精选文库 -实验三LINUX SHELL 编程 四.实验内容 本实验包含两个具体的SHELL程序编写任务,较为全面地涉及了SHELL 程序的设计方法和技术.内容如下: 1.创建以下菜单程序: USER ...
- linux —— shell 编程(文本处理)
导读 本文为博文 linux -- shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed a ...
- 【“计算机科学与技术”专业小白成长系列】Linux Shell 编程 极简教程
Linux Shell 编程 极简教程 内容摘要 本文是 Linux Shell 编程简单入门.主要内容: Linux 简介 Shell 编程入门 Kotlin 脚本与 Shell 脚本 Linux ...
- 《Linux Shell编程从初学到精通(第2版)》pdf
下载地址:网盘下载 内容简介 编辑 shell是用户与内核进行交互操作的一种接口,是linux最重要的软件之一.目前最流行的shell称为bash shell,bash shell脚本编程以其简洁.高 ...
- linux简单重定向代码,Linux Shell编程(26)——代码块重定向
像 while, until, 和 for 循环代码块, 甚至 if/then 测试结构的代码块都能做到标准输入的重定向. 即使函数也可以使用这种重定向的格式 .所有的这些依靠代码块结尾的 < ...
- Linux Shell编程语句case
Linux Shell编程case语句 case语句 case语句适用于需要进行多重分支的应用情况. case分支语句的格式如下:case $变量名 in模式1)命令序列1;;模式2)命令序列2;; ...
- linux shell 处理日语,linux —— shell 编程(文本处理)
导读 本文为博文linux -- shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 1.基本文本处理 sort:用于排序,常 ...
- linux怎么退出shell编程,Linux Shell编程(11)——退出和退出状态
exit命令一般用于结束一个脚本,就像C语言的exit一样.它也能返回一个值给父进程. 每一个命令都能返回一个退出状态(有时也看做返回状态).一个命令执行成功返回0,一个执行不成功的命令则返回一个非零 ...
- 超详细Linux 安装Mysql
超详细 Linux 安装Mysql 1.下载方式 1.1 Linux 内部下载(不推荐,比较慢) 1.2 本地下载,上传到linux 2.解压 3.创建MYSQL⽤户和⽤户组 4.配置my.cnf 5 ...
最新文章
- 国内IT图书出版的未来之路
- nginx连接php-fpm sock文件失败502
- 解决JavaWeb项目代码报错
- jquery通过ajax提交form
- CAN总线的初步认识
- Flutter 1.17 | 2020 首个稳定版发布!
- option标签selected=selected属性失效的问题
- 互联网晚报 | 8月28日 星期六 | 我国网民规模超10亿;vivo首款自研影像芯片下月首发;同程艺龙拟改名为同程旅行...
- Python使用pdfkit、wkhtmltopdf将html转换为pdf错误记录文档
- 区块链支付平台技术的应用
- java byte转十六进制_Python 十六进制hexbytesstr之间的转换和Bcc码的生成
- 智引IT综合管理解决方案
- Avast! 4 Server 服务器版license许可文件获得方法
- 计算机学打字教案小学,6 用金山打字通练指法
- vue lic在element-ui中使用阿里巴巴矢量图标库iconfont图标
- 世链投研|链游操作指南之MIR4
- UBOOT下自定义显示BMP图片
- 在线视频插上“大数据翅膀”
- 永恩上线服务器维护,LOL10.16永恩BUG商城问题介绍-LOL10.16永恩BUG商城问题有哪些_牛游戏网...
- python 拆包_python 拆包