目录
什么是shell
shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给换作系统,并处理各种冬样的操作系统的输出结果,输出到屏幕反馈给用户,属于非交互式对话。
面向过程语言
-
做一件事情,排出个步骤,第一步干什么,第二步干什么,如果出现情况A,做什么处理,如果出现了情况B,做什么处理
-
问题规模小,可以步骤化,按部就班处理
-
以指令为中心,数据服务于指令
-
语言:C,shell
面向对象语言 wi
-
将编程看成是一个事物,对外界来说,事物是直接使用的,不用关心事物内部的情况。而编程就是设置事物能够完成功能。
-
一种认识世界、分析世界的方法论。将万事万物抽象为各种对象
-
类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合
-
对象是类的具象,是一个实体
-
问题规模大,复杂系统
-
以数据为中心,指令服务于数据
-
语言:java,python,golang等 云 go k8个字母s 平台
Shell脚本的概念
-
将要执行的命令按顺序保存到一个文本文件
-
给该文件可执行权限
-
可结合各种Shell控制语句以完成更复杂的操作
Shell脚本应用场景
-
重复性操作
-
交互性任务
-
批量事务处理
-
服务运行状态监控
-
定时任务执行
shell的运行原理
人类写了一个命令集合,然后用bash ( shell)翻译给硬件,由硬件执行
脚本的构成
-
脚本声明(解释器):第一行开头"#!/bin/bash"表示此行以下的代码语是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器,#! /bin/python、#! /bin/expect
-
注释信息: 以#开头的语句表示为注释信息,可写中文
-
可执行语句: 比如echo命令用于输出” “之间的字符串
注意:脚本以.sh结尾,系统可自动识别shell语言,可将shell语法高亮
执行脚本命令
-
直接调用shell解释器,加上脚本的名字:bash.脚本名,不需要加上权限
-
路径/脚本,路径:相对或绝对,shell本质上也是一个程序,需要权限
-
source:(.)脚本名,不建议使用,会直接修改当前bash环境
注意:1、2种运行方式,是将程序加载到内存中运行,类似于另开一个运行的模块;3运行方式会在当前环境下直接运行,会修改当前bash的内容
补充:如果想让脚本全局运行(补全),可以将脚本加入$PATH路径下,并且脚本必须有执行权限,执行命令:echo "$PATH"
脚本执行逻辑
-
顺序执行:程序按从上到下顺序执行
-
选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
-
循环执行:程序执行过程中需要重复执行多次某段语句
脚本运行错误类别
-
命令错误:不会影响接下来的命令,但本条命令不执行
[root@localhost test1]#bash -x 脚本 #执行脚本,可以发现脚本错误 [root@localhost test1]#vim test.sh set -e #加在脚本的第一行 #在执行过程中如果出现错误,立即停止执行
-
语法错误:影响脚本不能正常运行
[root@localhost test1]#bash -n 脚本 #直接检查语法错误,但提示出错行数不一定准确
-
逻辑错误:不影响运行,但执行结果与
脚本变量
[root@localhost test1]#vim test.sh
set -u
#如果脚本中变量出错,立即停止执行
#!/bin/bash
dir=/opt
cd $dir
mv $dir
find $dir
touch $dir
标准输入输出
-
标准输出
你发了一条指令给电脑操作,电脑会回复结果给你,结果是一定显示在屏幕上
-
错误输出
电脑没有正确回复,就是错误
-
标准输入
我们通过键盘、鼠标、扫描仪、话筒等设备,输入给电脑的指令
-
重定向
-
改变输出方向,默认电脑数据的输出方向是屏幕
-
输出到别的 终端设备
-
输出到文件中
-
">"和"<"表示输出的方向,>:表示覆盖;>>:表示追加
-
命令后加&/dev/null:表示将文件移动到垃圾箱
-
管道符操作
|:将左侧的命令输出结果,作为右侧命令的处理对象
[root@localhost test1]#ps aux |grep bash
#查找所有的进程,并过滤出名称中有bash的进程
变量
变量:可变化的值
常量:不可变化的值
注意:在shell中不区分数据类型,所有的数据都是字符串
设置变量
变量名=变量值(两边都不可有空格)
调用变量
echo $变量名
删除变量
unset 变量名
重定义变量
变量名=变量值
追加变量值
变量名+=变量值
[root@localhost test1]#vim test.sh
dir=/data
#设置变量
[root@localhost test1]#echo $dir
#调用变量
[root@localhost test1]#unset dir
#删除变量
[root@localhost test1]#vim test.sh
dir=/opt
#重定义变量
[root@localhost test1]#vim test.sh
dir=/data
dir+=/opt
#追加变量
[root@localhost test1]#vim test.sh
#!/bin/bash
read -p "请输入第一个数:" num1
read -p "请输入第二个数:" num2
expr $num1 + $num2
例:
[root@localhost test1]#vim test.sh
#!/bin/bash
read -p "请输入行:" line
read -p "请输入列:" list
expr $line \* $list
#运算line*list
#*前必须加转义符,表示乘法;否则表示任意,语法错误
常见shell变量类型
-
自定义变量
-
export:加在命令前表示当前环境下所有程序都执行
-
expr 变量 运算符 变量:计算
-
echo $[RANDOM%3]:表示任意数取余三,$[]:等同于expr,表示计算
-
echo 变量 运算符 变量 | bc:也表示计算,但只有这个可以运算小数
-
[root@localhost testl]# vim ji.sh
#!/bin/bash
read -p“请输入第一个整数:” num1
read -p“请输入第二个整数:” num2
#执行加法运算
sum= expr $num1 + $num2
echo "运算结果为$sum'
[root@localhost testl]# chmod +x ji.sh
[root@localhost testl]# ./ji.sh
请输入第一个整数:6
请输入第二个整数:9
运算结果为15
-
预定义变量:$?、$$、$*、$@等shell中自带
-
显示当前bash的uid号:echo $$
-
预定义符号 | 含义 |
---|---|
$? | 表示前一条命令执行后的返回状态,返回值为0,表示执行正确,返回任何非0值,均表示执行出现异常 |
$0 | 表示当前执行的脚本或程序的名称,当前脚本的名字 |
$* | 表示所有位置参数的内容看成一个整体返回,返回所有 |
$@ | 表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回,返回所有 |
$# | 表示命令行中位置参数的总个数 |
$ | 当前bash的进程id |
$! | 后台任务最后一个id |
[root@localhost testl]#vim content.sh
#!/bin/bash
echo $1
#显示第一个字符
echo $2
#显示第二个字符
echo $3
#显示第三个字符
echo $0
#显示当前脚本名称
echo $#
#显示参数的总数
echo $*
#将参数内容作为一个字符显示
echo $@
#将参数内容分为单个字符,独立显示
[root@localhost testl]#bash content.sh {a..z}
a
b
c
content.sh
26
a b c d e f g h i j k l m n o p q r s t u v w x y z
a b c d e f g h i j k l m n o p q r s t u v w x y z‘
[root@localhost testl]#cat test1.sh test2.sh test3.sh
#!/bin/bash
echo "@的结果"
./test3.sh "$@"
#利用test3.sh打印@的结果
#!/bin/bash
echo "*的结果"
./test3.sh "$*"
#!/bin/bash
echo $1
-
环境变量:env可以看到所有环境的变量
-
只读变量:只能读,不能改
-
位置变量:$1、$2、$3········$n
系统内置变量:PATH、UID、HOSTNAME、USER
查看系统的变量信息
[root@localhost testl]#vim system.sh
#!/bin/bash
ip=`ifconfig ens33 |grep netmask |tr -s " " |cut -d " " -f3`
#tr -s " "表示压缩空格
cpu=`lscpu |grep 型号名称 |tr -s " " |cut -d " " -f2`
mem=`free -h |grep Mem |tr -s " " |cut -d " " -f2`
disk=`lsblk |grep disk |tr -s " " |cut -d " " -f4`
echo "-----------------systeminfo-------------------"
echo "本机ip:${ip}"
echo "主机名:$(hostname)"
echo "系统版本:$(cat /etc/redhat-release)"
echo "CPU型号:$cpu"
echo "内存大小:$mem"
echo "磁盘大小:$disk"
echo "----------------------------------------------"
[root@localhost testl]#sz system.sh
#导出至指定路径
特殊符号
符号 | 作用 |
---|---|
${} | 定义的变量名的范围,只要写在{}内就不会出错 |
" " | 变量在双引号中可识别,弱引用 |
" | 变量在单引号中不可识别,强引用 |
`` | 反撇号,代表引用命令执行的结果,效果等于$() |
echo
语法:echo [选项] " "
[选项]:
-
-e:表示输出转义符
常用选项 | 作用 |
---|---|
\r | 光标移至行首,并且不换行 |
\s | 当前shell的名称,如bash |
\t | 插入Tab键,制表符 |
\n | 输出换行 |
\f | 换行,但光标仍停留在原处 |
\ | 表示插入"\"本身转义 |
\b | 表示退格,不显示前一个字符 |
\c | 抑制更多的输出或不换行,在内容中间会将后面的字符删除 |