一.shell的基本概念
1.shell的作用
将要执行的命令按顺序保存到一个文本文件
给该文件可执行权限
可结合各种shell控制语句以完成更复杂的操作
2.shell脚本应用场景
-
重复性操作
-
交互性任务
-
批量事务处理
-
服务运行状态监控
-
定时任务执行等
3.shell作用—翻译官
shell是一个特殊的应用程序,它介于操作系统内核和用户之间,充当了一个 “命令解释器” 的角色,负责接收用户输入的操作指令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
4.linux中常见的shell
-
bash:基于gun的框架下发展的shell
-
csh:类似c语言的shell
-
tcsh:整合了csh提供了更多的功能
-
sh:已被bash替代
-
nologin:让用户无法登录
-
bash(/bin/bash)是目前大多数linux版本采用的默认shell
二.shell脚本
1.shell编程规范
脚本申明(解释器) :若第一行为“!/bin/bash",表示此行以下的代码语句是通过/bin/bash程序来解释执行,#!/bin/bash为默认解释器。
还有其它类型的解释器,比如# !/usr/bin/python. #! /usr/bin/expect.
注释信息:以“#"开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行。
2.shell脚本执行方法
1.绝对路径需要加执行权限
2.先对路径需要加执行权限
3.指定shell来解释脚本不需要加权限
4.使用source或. 后面跟上脚本路径不需要加权限
3.脚本的执行方式
指定路径去执行文件,文件需要有执行权限。
- 绝对路径。如:/opt/juli.sh
- 相对路径。如:./juli.sh
举例:
4.指定解释器去执行(bash 脚本名),不需要执行权限
注:执行脚本时的shell环境:
-
source和 . 执行脚本时,会在当前shell环境中执行脚本。
-
bash、绝对路径、相对路径 执行脚本时,会创建一个子shell环境,并在这个子shell环境中执行脚本。
-
不建议使用source来执行脚本,可能会影响一些资源配置。
-
脚本中的空白行会被解释器忽略。
-
脚本中,除了shebang,余下所有以#开头的行,都会被视作注释行而被忽略。
5.脚本错误调试
令错误: 命令错误不会影响接下来的命令,之后的命令会继续执行。
语法错误: 会导致后续的命令不执行。造成脚本中一部分命令已执行,一部分未执行。
逻辑错误: 执行后的效果不是自己想要的,需要自己去排查。
bash -n 脚本名称 //只检查语法错误,不真正执行脚本。定位的错误行可能不准确。
bash -x 脚本名称 //显示每个命令的执行过程,方便发现逻辑错误。
三.重定向
1.重定向的意思就是,不通过标准输出到默认屏幕上,而是输出到你指定的位置。
交互式硬件设备
标准输入:从该设备接收用户输入的数据
标准输出:通过该设备向用户输出数据
标准错误输出:通过该设备报告执行出错信息
2.重定向操作
注:
- &表示混合,&> 和 >& 都表示将标准输出和错误输出重定向到同一个文件。
- 命令 > 文件 2>&1,表示把错误输出2重定向给前面的标准输出1 (前面的1被省略了),即将错误输出和标准输出保存到同一个文件中。
举例:
四.shell脚本的变量
1.变量作用
用来存放系统和用户需要使用的特定参数(值)
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化
2.变量的分类
自定义变量:由用户自定义,修改和使用
环境变量:由系统维护,用于设置工作环境
只读变量:只可以读不可以更改
位置变量:通过命令行给脚本传递参数
预定义变量:bash中内置的一类变量,不能修改
系统内置变量:PATH、UID、HOSTNAM、USER
3.命名要求
区分大小写
不能使程序中的保留字和内置变量:如: if, for, hostname
只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线“-",和主机名相反
不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
下划线: student_name
4.自定义变量
格式:
-
变量名=变量值
-
{} 可以定义变量的范围,确定变量的字符范围
-
“”(双引号) 可以识别变量
-
' '(单引号) 不可以识别变量
-
``(放撇号)可以调用命令的结果作为变量值$(命令)也可以
举例1:
举例2
举例3
举例4
举例5
5.变量追加值
格式 :变量名+=追加值
举例:
永久设置变量:
[root@localhost ~]# vim /etc/profile #编辑配置文件
6.uset [变量名]
删除变量
从键盘输入内容为变量赋值
格式:read [-p "提示信息"] 变量名
示例:
五.Shell中的算术运算
注:默认情况下bash只支持整数运算,不支持小数运算。
1.运算表达
运算表达式:
(1) expr 变量1 运算符 变量2 [运算符 变量3]...
(2) let var=算术表达式
(3) ((var=算术表达式)),和上一个等价
(4) var=$[算术表达式]
(5) var=$((算术表达式))
(6) var=$(expr arg1 arg2 arg3 ...)
(7) var= expr arg1 arg2 arg3 ...
(8) echo '算术表达式' | bc
运算符
- 加法 +
- 减法 -
- 乘法 \ *
- 除法 /
- 取余 (取模)%
运算法则
- 加法: num1 + num2
- 减法:num1 - num2
- 乘法:num1 \ * num2
- 整除:num1 / num2
- 取余(求模):num1 % num2 (求 num1 除以 num2 的余数)
2.运算举例
2.1 expr
expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。
- 变量和运算符之间,要用空格隔开。
- 用反斜杠 \ 放在 shell 特定的字符前面;
- 对包含空格和其他特殊字符的字符串要用引号括起来
举例1:
举例2
2.2 let
let var=算术表达式 和 ((var=算术表达式)) 效果等同。
两者都不返回结果,需要借助echo命令。
2.3$[ ]和$(( ))
3.小数运算
使用bc计算器
Bash内置了对整数运算的支持,但是并不支持浮点运算,而 bc 计算器可以很方便的进行浮点运算。
-
支持交互式和非交互式两种方式。
-
使用scale=n可以指定精度,即小数点后的位数。要写在算术表达式之前。
-
非交互式运算,使用 echo "算术表达式" | bc。 多个算术表达式之间用分号隔开,例如:echo '1+1;2+2" | bc。
4.生成随机数
使用 echo $[RANDOM%n] 可以生成随机数,n为正整数。
对 n 取余数的范围是 [0,n-1]。
echo $[RANDOM%30]生成的随机数范围为 [0,29]- 如果希望随机数范围都为正整数,即不包含0的话,可以
echo $[RANDOM%39+1],此时随机数范围为[1,39]。
举例: