一 SHELL前言
1.什么是shell;
2.shell语言的特点:
SHELL语言是指UNIX操作系统的命令语言,同时又是该命令语言的解释程序的简称。
Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。
Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;
作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
它虽然不是Unix/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序、
建立文件并以并行的方式协调各个程序的运行。
因此,对于用户来说,shell是最重要的实用程序,
深入了解和熟练掌握shell的特性极其使用方法,是用好Unix/Linux系统的关键。
3.shell能做什么:
- 自动化批量系统初始化程序 (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(业务上线) - 俄罗斯方块,打印三角形,打印圣诞树,打印五角星,运行小火车,坦克大战,排序算法实现
- Shell可以做任何事(一切取决于业务需求)
4.shell多种执行方式;
1.准备测试脚本:
[root@localhost tmp]#vim file1
echo “hello 2020”
read -p "请输入您的姓名:“ name
echo “哈哈 $name是大笨蛋”
2.执行1;bash ping01.sh
3.执行2:sh ping01.sh
which bash
which sh
发现是同一个文件
4.执行3: . bash. sh
5.执行4: source bash.sh 同理执行3
6.多种执行方式的区别:
1和2的方式,是子shell
3和4的方式,是本shell
1.准备环境
vim bash.sh
#!/usr/bin/bash
cd /home/
ls
- 一种执行方式测试
. bash.sh
3.观察目录改变了。说明影响的是当前。并使用子shell执行方式执行。
该种执行方式,是不同于前者SUB shell执行。
而是在当前shell执行,用于影响当前shell环境。
二 BASH SHELL
1.第二阶段shell课程概览:
- shell特性
易学,高效 - shell变量
- shell条件测试,判断
- shell数值运算
- 流控、循环
命令汇总
if
case
for
while
until
break 跳过
continue 终止
exit 退出
shift 退出
array 数组统计
function 函数 - 企业项目
2.shell命令解释器有哪些:
shell 命令就是前一阶段所学习的大部分命令。 cp ls date组合到一起。
Linux支持的shell有哪些呢?
cat /etc/shells
或
chsh -l
三 变量
1.简介:
shell 变量? 用一个固定的字符串去表示不固定的内容,便于修改。
2.变量的类型:
1.自定义变量;
特性:
- 自定义变量(示例:ping01.sh引入变量)
定义变量: 变量名=变量值 变量名必须以字母或下划线开头,区分大小写 ip1=192.168.2.115
引用变量: $变量名 或 ${变量名}
查看变量: echo $变量名; "set"可以查看所有变量(包括自定义变量和环境变量)
取消变量: unset 变量名
作用范围: 仅在当前shell中有效
示例0:
使用变量前。麻烦
ping -c1 192.168.100.10 &>/dev/null && echo 192.168.100.10up || echo 192.168.100.10down
使用变量后,简洁
#!/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"
变量赋值(定义变量):
1.显式赋值;
- 显式赋值
变量名=变量值
示例:
ip1=192.168.1.251
school=“BeiJing 1000phone”
today1=date +%F
today2=$(date +%F)
2.read从键盘读入变量值:
2. read 从键盘读入变量值
read 变量名
read -p "提示信息: " 变量名
read -t 5 -p "提示信息: " 变量名 //-t 等待5秒,后超时
read -n 2 变量名 //-n 只记录几个字符
read -p “请输入您测试的IP地址:” ip
ping -c1 $ip &>/dev/null && echo "
i
p
u
p
"
∣
∣
e
c
h
o
"
ip up" || echo "
ipup"∣∣echo"ip
down"
~
3.注意事项,3种引号:
定义或引用变量时注意事项:
1
" " 弱引用
’ ’ 强引用
[root@tianyun ~]# school=1000phone
[root@tianyun ~]# echo "KaTeX parse error: Expected 'EOF', got '#' at position 61: …root@tianyun ~]#̲ echo '{school} is good’ //脱去所有字符
${school} is good
2
命令替换 等价于 $() 反引号中的shell命令会被先执行
[root@tianyun ~]# touch date +%F
_file1.txt
[root@tianyun ~]# touch $(date +%F)_file2.txt
2.环境变量(了解):
定义环境变量: 方法一 export back_dir2=/home/backup
方法二 export back_dir1 将自定义变量转换成环境变量
引用环境变量: $变量名 或 ${变量名}
查看环境变量: echo $变量名 env 例如env |grep back_dir2
取消环境变量: unset 变量名
变量作用范围: 在当前shell和子shell有效 !!!
使变量开机、登陆生效,将变量放到~/.bash_profile
3.位置变量和预定义变量(了解):
语法
命令 参数1 参数2 参数3 …9以后特殊定义
$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} …
预先定义过的变量
$0 脚本名
$* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的PID
$! 上一个后台进程的PID
$? 上一个命令的返回值 0表示成功
示例1
示例1:
vim test.sh
#!/usr/bin/bash
echo “第2个位置参数是$2”
echo “第1个位置参数是$1”
echo “第4个位置参数是$4”
echo “所有参数是: $*”
echo “所有参数是: $@”
echo “参数的个数是: $#”
echo “当前进程的PID是: $$”
echo ‘$1=’$1
echo ‘$2=’$2
echo ‘$3=’
3
e
c
h
o
′
3 echo '
3echo′*=’
∗
e
c
h
o
′
* echo '
∗echo′@=’
@
e
c
h
o
′
@ echo '
@echo′#=’KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲ echo '
=
′
='
=′$
演示
[root@localhost ~]# chmod +x 1.sh
[root@localhost ~]# ./1.sh 1 2 3 4 5 6 7 8 9
第2个位置参数是2
第1个位置参数是1
第4个位置参数是4
所有参数是: 1 2 3 4 5 6 7 8 9
所有参数是: 1 2 3 4 5 6 7 8 9
参数的个数是: 9
当前进程的PID是: 1946
$1=1
$2=2
$3=3
$*=1 2 3 4 5 6 7 8 9
$@=1 2 3 4 5 6 7 8 9
$#=9
$$=1946
∗
和
*和
∗和@区别(资料)
shell中
∗
与
*与
∗与@的区别
关于$* 和 $@的 一点 认识 同是菜鸟一起学习
∗
所
有
的
位
置
参
数
,
被
作
为
一
个
单
词
.
注
意
:
"
* 所有的位置参数,被作为一个单词. 注意:"
∗所有的位置参数,被作为一个单词.注意:"*“必须被”“引用.
@
与
@ 与
@与*同义,但是每个参数都是一个独立的”“引用字串,这就意味着参数被完整地传递,
并没有被解释和扩展.这也意味着,每个参数列表中的每个参数都被当成一个独立的
单词.
注意:”$@"必须被引用.
$@ $* 只在被双引号包起来的时候才会有差异
双引号括起来的情况:
$*将所有的参数认为是一个字段
$@以IFS(默认为空格)来划分字段,如果空格在“”里面,不划分。采用LS的脚本运行./test 1 “2 3” 4 来发现差异
没有括起来的情况是 @ 和 @和 @和*一样的,见到IFS就划分字段。还是采用LS的脚本运行./test 1 “2 3” 4 来发现差异
一个小例子 ,仅供参考
[Copy to clipboard] [ - ]CODE:#!/bin/bash
echo
index=1
echo “Listing args with”$":"
for arg in "$"
do
echo “Arg #
i
n
d
e
x
=
index=
index=arg”
let “index+=1”
done
echo “所有的参数被认为是一个单词”
echo
index=1
echo “Listing args with “$@”:”
for arg in “KaTeX parse error: Expected 'EOF', got '#' at position 17: …" do echo "Arg #̲index=$arg”
let “index+=1”
done
echo “所有的参数被认为是各个独立的单词”
echo
index=1
四 变量的运算
1.整数运算:
方法一:expr
语法
方法一:expr
expr 1 + 2
expr $num1 + KaTeX parse error: Undefined control sequence: \* at position 10: num2 + - \̲*̲ / % +加 -减 \*乘 …(())
语法
方法二:$(())
echo
(
(
((
((num1+$num2)) + - * / %
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
2.小数运算(了解):
echo “2*4” |bc
echo “2^4” |bc
echo “scale=2;6/4” |bc
awk ‘BEGIN{print 1/2}’
echo “print 5.0/2” |python
bc:交互运算器
scale=2 保留小数点后面两位
awk和python做了解