【shell编程】【bash shell 特性】【bash 初始化】【shell的分类和切换】【shell使用场景】【变量的类型】【通配符置换】【shell 脚本规范】【变量运算】

初始shell

程序 语言 编程

语言
自然语言:汉语、英语
计算机语言:c语言、c++、(java php python go shell)
编译型语言 c c++ java
解释型语言 php python bash

编译型语言:编译型语言的首先将源代码编译生成机器语言,再由机器运行机器码(二进制)。像C/C++等都是编译型语言。
解释型语言:源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。比如Python/JavaScript/Shell等都是解释型语言
c 编译型执行代码需要编译成cpu能认识的二进制码 x86指令集
java 编译型执行编译–>字节码,cpu不能直接运行,只能被Java虚拟机执行
shell 解释型语言执行

shell 定义

Shell 也是一种程序设计语言,它有变量,关键字,各种控制语句,有自己的语法结构,利用shell程序设计语 言可以编写功能很强、代码简短的程序。
shell是外壳的意思,就是系统的外壳,我们可以通过shell的命令来控制和操作操作系统,比如linux中的shell命令就包括ls、cd、pwd等等,总结来说shell就是一个命令解释器,他通过接收用户输入的shell命令来启动、停止程序的运行或者对计算机进行控制。

shell的分类和切换

[root@linux-server ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin

#默认shell: bash shell
#centos中脚本使用的默认shell 为/usr/bin/sh

查看当前正在使用的shell

[root@linux-server ~]# echo $SHELL
/bin/bash

shell的修改
vim /etc/passwd 编辑登录shell

使用场景

Shell 能做什么? 总结 shell 能做你想在linux上想做的任何事情

  1. 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略…)—初始化脚本
  2. 自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx)—自动化安装脚本
  3. 应用管理程序 (KVM)—批量创建虚拟机、管理虚拟机。
  4. 日志分析处理程序(PV, UV, 200, !200,grep/awk)----akw、sed、grep
  5. 自动化备份恢复程序(MySQL完全备份/增量 + Crond)-----数据备份恢复脚本
  6. 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)–监控脚本
  7. 配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,Apache,MySQL)
  8. 9*9乘法表、俄罗斯方块,打印三角形,打印圣诞树,打印五角星,运行小火车,坦克大战,排序实现
  9. Shell可以做任何运维的事情(一切取决于业务需求)

shell 和ansible—批量自动化工具–自动化运维–ansible

shell 特性回顾

shell常见元素
文件描述符与输出重定向:
在 shell程序中,最常使用的FD (file descriptor) 大概有三个, 分别是:
0: Standard Input (STDIN)
1: Standard Output (STDOUT)
2: Standard Error Output (STDERR)
在标准情况下, 这些FD分别跟如下设备关联:
stdin(0): keyboard 键盘输入,并返回在前端
stdout(1): monitor 正确返回值 输出到前端
stderr(2): monitor 错误返回值 输出到前端

a.txt
1>a.txt
2>a.txt
&>a.txt
1>&2
2>&1
一般来说, “1>” 通常可以省略成 “>”.
1>&2 正确返回值传递给2输出通道 &2表示2输出通道,之前如果有定义标准错误重定向到某log文件,那么标准输出也重定向到这个log文件,如果此处错写成 1>2, 就表示把1输出重定向到文件2中.
2>&1 错误返回值传递给1输出通道, 同样&1表示1输出通道.

例子. 当前目录下只有a.txt,没有b.txt
[root@linux-server ~]# touch a.txt
[root@linux-server ~]# ls a.txt b.txt 1>file.out 2>&1
[root@linux-server ~]# cat file.out
ls: cannot access b.txt: No such file or directory
a.txt
现在, 正确的输出和错误的输出都定向到了file.out这个文件中, 而不显示在前端

bash 初始化

系统全局配置
用户登录时相关的bash配置文件 (登录脚本)属于全局配置文件:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc

个人配置文件,每个用户的配置文件
~/.bsah_profile
~/.bashrc
#profile类的文件: 设定环境变量,运行命令或脚本,用户在登录的时候会自动生效
#bashrc类的文件: 定义命令别名

用户登录时加载bash配置文件的过程:
登录式shell加载配置文件过程
~/.bash_profile --> ~/.bashrc --> /etc/bashrc —> /etc/profile --> /etc/profile.d/*.sh

#这里的优先级是影响范围最小的优先级最高

下面的文件为系统的每个用户设置环境信息Shell设置文件:
/etc/profile(系统级)启动时执行
这是系统最主要的shell设置文件,也是用户登陆时系统最先检查的文件,有关重要的环境变量都定义在此,其中包括 PATH,USER,MAIL,HOSTNAME,HISTSIZE,INPUTRC等。而在文件的最后,它会检查并执行/etc/profile.d/*.sh的脚本。

	~/.bash_login(用户级)登录时执行 
	如果~.bash_profile文件不存在,则系统会转而读取.bash_login这个文件内容。这是用户的登陆文件,在每次用户登陆系统时,bash都会读此内容,所以通常都会将登陆后必须执行的命令放在这个文件中。
	~/.bash_logout 离开时执行如果想在注销shell前执行一些工作,都可以在此文件中设置。 例如:

vim ~.bash_logout
clear
仅执行一个clear命令在你注销的时候

~/.bash_history(用户级) #这个文件会记录用户先前使用的历史命令。

bash shell 特性

补全 tab键 #yum -y install bash-completion 自动补全包
历史–history
别名—alias
快捷键—ctrl+c+l 终止+清屏
编写 vim时放到后台 ctrl+z
前后台作业—jobs fg bg & fg调出
重定向 > >> <
管道 —|
#命令排序执行: ; && ||
&&:逻辑与,前面执行成功,后面才执行。前面命令执行失败,后面命令也不执行
||:逻辑或,前面执行失败,后面执行,前面命令执行成功,后面不执行。
;:从左往右按顺序执行,不管前面执行成功与否,后面都执行

通配符:[] {} ? *
正则表达式 脚本

历史命令

查看历史命令
[root@linux-server ~]# history
调用历史命令
上下健
!关键字
!历史命令行号
!! 执行上一条命令
!$ 上一条命令的最后一个参数
esc . 上一条命令的最后一个参数
Ctrl+r 在历史命令中查找,输入关键字调出之前的命令
别名
查看别名
[root@linux-server ~]# alias 临时设置

永久设置
vim /root/.bashrc
source /root/.bashrc #让文件生效

小小技巧:显示历史命令执行时间
1.设置变量:
[root@linux-server ~]# vim /etc/profile #在最后添加
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S"
[root@linux-server ~]# source /etc/profile #让设置的环境变量生效
2.再次执行history查看结果

Bash 部分快捷键

Ctrl+a 切换到命令行开始(跟home一样,但是home在某些unix环境下无法使用)
Ctrl+u 清除剪切光标之前的内容
Ctrl+k 清除剪切光标之后的内容
ctrl+y 粘贴刚才所删除的字符
Ctrl+r 在历史命令中查找,输入关键字调出之前的命令
Ctrl+l 清屏
Ctrl+c 终止
Ctrl+e 切换到命令行末尾

通配符置换

在这里插入图片描述
在这里插入图片描述

shell 脚本规范

在这里插入图片描述

变量的类型

变量:bash作为程序设计语言和其它高级语言一样也提供使用和定义变量的功能,简单说就是让一个特定的字符串代表不固定的内容 a=123,echo $a
#分为:预定义变量、环境变量、自定义变量、位置变量
在这里插入图片描述

练习1

编写一个shell脚本,用于搜集其执行主机的信息,打印结果如下:
[root@linux-server ~]# mkdir /opt/test/script
[root@linux-server ~]# cd /opt/test/script
[root@linux-server script]# vim test.sh
[root@linux-server script]# chmod +x test.sh
[root@linux-server script]# ./test.sh
现在的时间是: 2020-08-22-17:34:03
当前的用户是: root
当前的用户标识: 0
当前的主机名称是: linux-server
当前可用网卡IP是: 192.168.246.148/24

##脚本源码如下
#!/usr/bin/bash

获取主机基本信息

time=date +%F-%T
ip=ip a | grep ens33 | awk 'NR==2 {print $2}'
echo “现在的时间是:” $time
echo “当前的用户是:” $USER
echo “当前的用户标识:” $UID
echo “当前的主机名称是:” $HOSTNAME
echo “当前可用网卡IP是:” $ip

取当前系统分区剩余空间:
[root@linux-server script]# df -Th | awk ‘NR==6 {print $5}’
489M
取当前系统剩余内存:
[root@linux-server script]# echo “现在的剩余内存是:”free -m |awk 'NR==2{print $4}'
现在的剩余内存是:16G

取当前cpu平均负载:
[root@linux-server script]# echo 现在cpu的uptime | cut -d, -f3- #-d指定分隔符,-f指定显示区域,3-第三列以后(包括第三列)
现在cpu的 load average: 0.00, 0.01, 0.05
方式二:
[root@linux-server script]# echo 现在cpu的uptime | awk -F "," '{print $3,$4,$5}'
现在cpu的 load average: 0.00 0.01 0.05

自己练习
2、编写一个shell脚本,要求可以输出如下内容:

a、当前操作系统内核版本号:
b、当前用户是谁:
c、当前操作系统有多少用户:
在这里插入图片描述
在这里插入图片描述

变量运算

变量运算
算式运算符: +、-、、/、()、%取余(取模)
如:(5+3)2
运算方式:$(()) $[] expr
$(()):例子
echo $(( 5+2-(3
2)/5 ))
6
echo $(((3
2)/5))
1

$[]:例子
echo $[ 5 + 2 - (3*2)/5 ]
6
expr:例子
expr 5 + 3
8
#注意:运算符号两边的空格必须写

乘法运算:
[root@linux-server script]# expr 5 * 3
15
[root@linux-server script]# expr 5 ‘*’ 3
15

#脚本中常用的方式
echo " a 和 a和 ab的和是: expr $a '+' $b"

取1到6之间的随机数: RANDOM

echo $RANDOM
echo ( ( (( ((RANDOM % 6 + 1))
5
取1-10之间的随机数:
echo ( ( (( ((RANDOM % 10 + 1)
5
这串代码特别简单,就是利用RANDOM这个随机数生成器进行取余就能够实现,至于为什么取余时需要+1是因为在取余时如果被整除那么余数会是0,这样就不在限定范围内了

浮点运算

浮点运算
bash本身不能做小数计算:需要bc命令转换
方法;yum install -y bc
方法;’echo “2.6*4” | bc
方法;echo “2^4” | bc

变量引用 ‘’ " "

#转义:
1.当一个字符被引用时,其特殊含义被禁止,把有意义的变的没意义,把没意义的变的有意义
转义案例:
[root@linux-server script]# echo you now $1250
you now 250
[root@linux-server script]# echo you now $1250
you now $1250

完全引用:’’ #强引 硬引 #指的是被引号包围起来的变量名不会进行不会进行解析,原样变量名原样输出,这种方式比较适合定义显示纯字符串的情况,不希望解析变量、命令等的场景。
部分引用:"" #弱引 软引 #指的是被引号包围起来的变量名会先进行解析,然后将变量的解析结果输出来。这种方式适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。

例子:
[root@linux-server script]# num=1
[root@linux-server script]# echo 1901班有KaTeX parse error: Expected 'EOF', got '#' at position 45: …-server script]#̲ echo "1901班有num个女生"
1901班有1个女生
[root@linux-server script]# echo '1901班有 n u m 个 女 生 ′ 1901 班 有 num个女生' 1901班有 num1901num个女生

读取用户标准输入:read

read:功能就是读取键盘输入的值,并赋给变量
#read -t 5 var
#read -p “提示信息” var
#read -s 选项 能够使read命令中输入的数据不显示在监视器上
read后面的变量var可以只有一个,也可以有多个,这时如果输入多个数据,则第一个数据给第一个变量,第二个数据给第二 个变量,如果输入数据个数过多,则最后所有的值都给最后一个变量

#!/usr/bin/bash
read -p "请输入你的用户名和密码还有你的年龄: " name pass age
echo “你的名字是 $name”
echo “你的密码是 $pass”
echo “你的年龄是 $age”

案例1:
[root@linux-server script]# vim readtest.sh
#!/bin/bash

read test

read -p “请输入你的银行卡帐号” num
read -p “请在五秒内输入密码” -t 5 pass
echo “你的密码错误!”
[root@linux-server script]# ./readtest.sh

案例2: #-s 选项 能够使read命令中输入的数据不显示在监视器上
[root@linux-server script]# vim readtest3.sh
#!/bin/bash
read -s -p "Enter your password: " pass
echo “your password is $pass”
exit 1
[root@linux-server script]# chmod +x readtest3.sh
[root@linux-server script]# ./readtest3.sh

取消屏幕回显

[root@linux-server script]# stty -echo #回车测试
[root@linux-server script]# stty echo #恢复回显

显示变量长度

[root@linux-server script]# a=123
[root@linux-server script]# echo KaTeX parse error: Expected '}', got '#' at position 2: {#̲a} #表示var的长度

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值