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
fordo...
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 变量 in
one)
命令
;;
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/bashfunction 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/bashcat << 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 ]]do
read -p "请输入运算类型:" i
read -p "请输入两个数进行计算:" a b
case $i in
1)
addition
continue;;
2)
subtraction
continue;;
3)
multiplication
continue;;
4)
division
continue;;
5)
mi_yunsuan
continue;;
6)echo"运算结束,退出!"break
esac
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" [email protected] #发邮件
注意:
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
使用量除以总量 看百分比
版权归原作者 别掉头发啦 所有, 如有侵权,请联系我们删除。