一、shell脚本基础
shell的含义
shell是什么?
shell是人和计算机内核之间的中介
把人类的语言翻译成计算机能够识别的语言,然后让内核来处理。
内核完成之后要把结果反馈给用户,要把计算机的翻译成人类能够识别的语言。
shell类型
bash,主流,Linux系统默认的
sh bash,sh的升级版
csh,类C语言的shell
tcsh,csh的升级版
nologin,禁止用户登录,也是一种shell
shell脚本
shell脚本的含义和作用
shell脚本是扩建语言,或者是动态语言,是一种编程的语言。控制软件的应用程序,只要在被调用时,才会执行。
- 本:代码是保存在文本当中,特定条件(运行代码的条件)
- 脚:把保存在文本中的代码执行起来
shell脚本的作用
自动化运维
批量化重复操作可以通过脚本和计划任务来进行自动运行
减轻了管理人员工作量
避免配置出错
shell脚本的结构
脚本文件格式
脚本文件:默认以 .sh 为结尾的文件
脚本文件内容:
脚本运行格式
1、bash:调试模式,创建一个子shell环境,只在这个子环境当中运行,不会”真正"执行。
source:点命令,真正的执行代码
可以看出我们使用source的命令运行脚本后,所处的目录不在shcode下,而在boot目录下,这是因为source真正执行了一遍脚本,cd到了 /boot目录下。
2、赋权执行
使用路径执行,如在当前路./或者绝对路径,绝对路径必须要赋权。
3、定时任务,必须使用绝对路径
重定向
重定向就是把这些信息保存到指定的文件当中
1、重定向输入:<,从指定文件中获取内容
2、重定向输出:>,只能把标准输入保存到文件当中,如果原文有内容会直接覆盖。
>>,把标准输入保存到文件当中,不会覆盖原文,而是在原文中追加。
3、重定向错误输出:2>,将错误的信息保存到指定文件中,会覆盖原文内容。
2>>,将错误的信息保存到指定文件中,不会覆盖而是后行追加。
4、混合输出:&>将标准输出、标准错误保存到同一文件中,覆盖原内容
&>>将标准输出、标准错误保存到同一文件当中,内容不会被覆盖而是在行后追加
变量
变量用来存放系统和用户需要使用的特定的参数
变量名
系统定义好的,每个用户都可以使用(全局变量),一般情况下是不可以修改的。
自定义变量名:
- 不要使用系统的命令作为变量名称
- 不要使用中文
- 变量名不能使用特殊符号来开头,除下划线
- 定义变量,一定要时字母开头,不能以数字开头
- 变量名最好是对应的名称的英文全称或者简写
变量值
- int,整数,没有小数点
- string,字符串,字母或者数字组成,用引号引起来
- 布尔,true/false,为真还是假,一般用于条件判断的返回值
- 浮点,1.23
打印变量值
echo $变量名
echo "${变量名}添加内容"
强弱引用
赋值时无所谓,打印时是有区别的。
强引用:单引号,打印变量时,就是字符串的本身,不再代表变量的值
弱引用:双引号,打印变量时,加上双引号就是变量的值
自定义变量read
如我们创建自定义变量a和b,运行脚本,赋予a为1,b为2,结果如下
变量的作用范围
全局变量
全局变量(主要是系统定义,不能改的)
在全局配置文件 /etc/profile 中修改,export 变量名=值
副作用:所有用户都可以使用,一旦有改动,增加了复杂性。
环境变量
全局变量的一种,系统创建的,设置用户的工作环境
由系统维护,一般用户是不去修改的,让所有人都可以自动识别到(自动补齐)
位置变量
脚本外传参,相当于另一种自定义变量,表示未赋值,如$1。
预定义变量$@#?
也是另一种自定义变量,脚本解释器提供的,或者是编程语言自带的,不能修改。
$*:表示命令或者脚本需要处理的参数,区别在于处理的方式不同,"$*",会把参数当作一个整体进行处理;不加双引号,会把参数一个一个处理。
$@:表示命令或者脚本需要处理的参数,加不加双引号,都会把参数一个一个处理。
$#:记录传递给脚本参数的个数
$?:记录的上一次执行命令的返回码,用来判断上一次执行命令是否成功
0和非0,0表示上一次命令执行成功,其他都是失败
由上可以看出,$*加双引号输出是一个整体,不加则是一个一个输出。
由上可以看出,$#是记录传递给脚本参数的个数
由上可以看出,0代表上一次命令ls执行成功,而127则是表示上一次错误的命令执行是失败的。
变量的运算
运算符:
+ - * / %(加减乘除 取余)
整数运算
c=$(($a*$b)) echo $c(要有双括号)
i=$(expr 12 \* 5) echo $i( * 和 / 前面需要加 \ )
let d=12+10 echo $d