赞
踩
shell
壳
命令解释器,一种应用程序。
SHELL语言是指UNIX操作系统的命令语言,同时又是该命令语言的解释程序的简称。
Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,
用户的大部分工作都是通过Shell完成的。
Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,
它交互式地解释和执行用户输入的命令;
作为程序设计语言,它定义了各种变量和参数,
并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
它虽然不是Unix/Linux系统内核的一部分,
但它调用了系统核心的大部分功能来执行程序、
建立文件并以并行的方式协调各个程序的运行。
因此,对于用户来说,shell是最重要的实用程序,
深入了解和熟练掌握shell的特性极其使用方法,是用好Unix/Linux系统的关键。
- 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略…)
- 自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx)
- 应用管理程序 (KVM,集群管理扩容,MySQL,DELLR720批量RAID)
- 日志分析处理程序(PV, UV, 200代码, !200代码, top 100, grep/awk)
- 自动化备份恢复程序(MySQL完全备份/增量 + Crond)
- 自动化管理程序(批量远程修改密码,软件升级,配置更新)
- 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
- 配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
- 自动化扩容(增加云主机——>业务上线)
zabbix监控CPU 80%+|-50% Python API AWS/EC2(增加/删除云主机) + Shell Script(业务上线)- 俄罗斯方块,打印三角形,打印圣诞树,打印五角星,运行小火车,坦克大战,排序算法实现
11. Shell可以做任何事(一切取决于业务需求)
准备测试脚本
[root@localhost tmp]#vim 000.sh
cd /home
touch reward.txt
echo “hello 2020”
read -p “请输入您的姓名:” name
echo "恭喜你 $name 中奖了"
执行1:bash file1
执行2:sh file1
执行3:. file1
执行4: source file1
cat /etc/shells
或
chsh -l
shell 变量? 用一个固定的字符串去表示不固定的内容,便于修改。
用户自定义变量是最常用的变量类型,
其特点是变量名和变量值都是由用户自由定义的。
定义变量: 变量名=变量值
引用变量: $变量名
或 ${变量名}
查看变量: echo $变量名;
"set"可以查看所有变量(包括自定义变量和环境变量)
取消变量: unset 变量名
变量的定义就是这么简单,但是如果不遵守变量定义规则,就会报错。比如:
#变量名不能以数字开头
[root@localhost ~]# 2name="xulei 666"
-bash: 2name=shen chao: command not found
#等号左右两侧不能有空格
[root@localhost ~]# name = "xulei 666"
-bash: name: command not found
#变量的值如果有空格,必须用引号包含
[root@localhost ~]# name=xulei 666
-bash: 666: command not found
>重复定义变量
重复定义变量会进行变量叠加。例如:
#定义变量aa的值是123
[root@localhost ~]# aa=123
#重复定义变量aa的值是源aa的值加上456
[root@localhost ~]# aa="$aa"456
#调用变量aa,发现值已经变成了123456
[root@localhost ~]# echo $aa
123456
#在进行变量叠加时,也可以使用${变量名}格式
[root@localhost ~]# aa=${aa}789
[root@localhost ~]# echo $aa
123456789
这里要小心,在进行变量叠加时,变量名需要用双引号或 ${} 包含。
aa=123
aa="$aa"456aa=${aa}789
我们可以通过 echo 命令查询已经设定的变量的值,
这种查询是已知变量名查询变量值。
但是如果我不知道变量名,那么可以查询系统中已经存在的变量吗?
[root@localhost ~]# set
使用变量前
需求
编写测试主机在线的脚本。当主机在线提示在线,当主机不在线提示不在线。
编写脚本
[root@localhost ~]vim ping.sh
ping -c1 192.168.100.10 &> /dev/null && echo 192.168.100.10up || echo 192.168.100.10down
注释
&&和||是三目表达式
&& 前面的命令成功。执行后面的命令
||前面的命令失败。执行后面的命令
授权脚本
[root@localhost ~]#chmod +x ping.sh
执行脚本
[root@localhost ~]#./ping.sh
思考
如果更换测试IP。需要修改脚本的哪些部分?
需要修改三个部分
使用变量后
编写脚本
[root@localhost ~]vim ping.sh
#!/bin/bash
ip=192.168.100.10
ping -c1 $ip &>/dev/null && echo i p u p ∣ ∣ e c h o " ip up || echo " ipup∣∣echo"ip down"
授权脚本
[root@localhost ~]# chmod +x ping.sh
执行脚本
[root@localhost ~]# ./ping.sh
思考
添加变量后,修改一处即可。
双引号1
[root@localhost ~]# schoo=1000 phone
错误示范,shell把空格识别做命令分隔符。
bash: phone: 未找到命令
[root@localhost ~]# schoo=“1000 phone”
正确示范,变量值中的空格,被转义为一个普通符号
[root@localhost ~]# echo $schoo
1000 phone
执行成功。
双引号2
[root@localhost ~]# schoo=$schoo is good
错误示范,已有变量的基础上,再追加内容。
bash: is: 未找到命令
没有加引号,被识别为两条命令
[root@localhost ~]# schoo="$schoo is good"
正确示范,加了双引号。组成了整体,空格失去含义。
[root@localhost ~]# echo $schoo
1000 phone is good
成功
单引号
[root@localhost ~]# schoo=’$schoo 666’
单引号,转义一切符号
[root@localhost ~]# echo $schoo
$schoo 666
$也被转义了。一切都被转义了。
反引号
[root@localhost ~]# schoo=date
反引号是优先执行。先执行date的命令,再执行定义变量。
[root@localhost ~]# echo $schoo
2020年 05月 06日 星期三 14:57:13 CST
所以看到变量的结果,是时间
变量名和等号之间不能有空格,同时,变量名的命名须遵循如下规则:
=命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
起变量名,请使用五个字母以上。
方法一:expr
语法
expr 1 + 2
expr $num1 + $num2
+加
-减
*乘(*是任意字符,使用\ 转义一下。)
/除
%取余
案例
需求
运算学员的成绩总分
制作脚本
[root@localhost ~]# vim sum.sh
#!/bin/bash
read -p "请输入您的第一门成绩: " number1
read -p "请输入您的第二门成绩: " number2
echo -n "总成绩是: "
#echo -n 不换行输出
expr $number1 + $number2
授权脚本
[root@localhost ~]# chmod +x sum.sh
测试脚本
[root@master1 ~]# ./sum.sh
请输入您的第一门成绩: 60
请输入您的第二门成绩: 70
总成绩是: 130
方法二: ( ( ) ) 语 法 方 法 二 : (()) 语法 方法二: (())语法方法二:(())
echo ( ( (( ((num1+$num2)) + - * / %
echo $((5-3*2))
echo $(((5-3)*2))
echo ( ( 2 ∗ ∗ 3 ) ) / / ( 蜜 ) 2 的 3 次 方 s u m = ((2**3)) //(蜜)2的3次方 sum= ((2∗∗3))//(蜜)2的3次方sum=((1+2)); echo $sum
方法三: [ ] 语 法 方 法 三 : [] 语法 方法三: []语法方法三:[]
echo $[5+2] + - * / %
echo $[5**2]
方法四:let
示例
方法四:let 表达式
let sum=2+3; echo $sum
let i++; echo $i
小数运算(了解)
请提前安装计算器程序bc
echo “2*4” |bc
echo “2^4” |bc
echo “scale=2;6/4” |bc
bc:交互运算器
scale=2 保留小数点后面两位
环境变量(了解)
自定义变量,只能再当前shell生效。其他shell是不生效的。
变量作用范围: 在当前shell和子shell有效
想使变量。在当前用户登陆后一直生效,可以将变量放到~/.bash_profile
想使变量。在所有用户登陆后一直生效,可以将变量放到/etc/profile
位置变量和预定义变量(了解)
位置变量
命令 参数1 参数2 参数3 …9以后特殊定义
$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 …
$0 脚本名/程序名
$* 所有的参数
$# 参数的个数
$? 上一个程序的返回值(0是成功,非零失败)
$$ 程序的PID
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。