一、shell脚本基础
1.1 shell脚本的作用
shell将人类使用的高级语言翻译成二进制,再将二进制翻译成高级语言。换句话就是人类写了一个命令集合,然后用bash去翻译给硬件执行。
linux中常见的shell:
bash:基于gun的框架下发展的shell
csh:类似c语言的shell
tcsh:整合了csh提供了更多功能
sh:已经被bash替换
nologin:让用户无法登录
shell的用途:
1. 简化操作,提高工作效率
2.避免重复劳动导致的出错
3.实现标准化
1.2 shell脚本是什么以及构成
把命令集合在一起然后一一执行
组成:
1.声明解释器(#!/bin/bash)
2.注释信息
3.可执行命令
1.3 脚本执行
执行逻辑:
脚本执行逻辑
-
顺序执行:程序按从上到下顺序执行
-
选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
-
循环执行:程序执行过程中需要重复执行多次某段语句
执行方式:
1.指定路径执行(需要执行权限)
2.指定shell解释器执行(不需要权限)
1.4脚本错误如何解决
第一种:命令错误,不会影响接下来命令执行可用bash -n检查错误
第二种:语法错误,直接影响脚本,无法正常运行可用bash -x执行检查
第三种:逻辑错误,没有适合的的方法解决
补充:set -e 放在脚本前面,一旦出错立即停止执行
set -u 变量不存在不让执行
二、重定向和管道符
2.1 重定向
重定向:改变电脑数据的输出方向,默认电脑数据的输出方向是屏幕
类型 | 设备文件 | 文件描述编号 | 默认设备 |
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
错误输出 | /dev/stderr | 2 | 显示器 |
标准输出:你发了一条指令给电脑,电脑回复给你,结果一定会显示在屏幕上
标准输入:我们通过键盘、鼠标等设备输入给电脑的指令
错误输出:电脑没有给出正确答复
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | 1> | 将输出结果保存到指定的文件(覆盖原有内容) |
>> | 将输出结果追加到指定的文件尾部 | |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
2>> | 标准错误输出结果追加到指定的文件尾部 | |
混合输出 | &>无论对错都可以重定向 | 将标准输出、标准错误的内容保存到同一个文件中 |
正确输出
错误输出
2.2 多行重定向
#####将内容写入文件
[root CXK /opt]#cat >test.txt <<error
> 123
> 345
> 567
> error
2.3 管道符
|
作用:将第一个命令的结果当作后一个命令的处理对象
三、变量
含义:变量源于数学,是计算机语言中的一个抽象概念,可以存储计算结果或表示一个值。 变量可以通过变量名访问。在命令式语言中,变量通常是可变的。
只能不能修改是常量
3.1 变量类型
1.自定义变量:由用户自己定义修改和使用
2.预定义变量:bash中内置的一类变量,不能修改规定
3.环境变量:env看到所有环境标量
4.只读变量只可以读取不能修改的变量,相当于常量,用处较少
5.位置变量:通过命令行给脚本传递参数
4.只读变量:只可以读取不可以更改
5.位置变量:通过命令行给脚本传递参数
系统内置变量:PATH,UID,HOSTNAME,USER
3.2 命名要求
1. 区分大小写
2. 不能使用内置变量
3. 只能使用数字字母下划线,不能以数字开头,不支持“-”
4. 大驼峰 StudentFirstName
5. 小驼峰 studentFirstName
1.赋值时使用双引号(" ")可以直接调用变量
2.赋值时使用单引号(' ')变量$只会被认为是字符$ 不会调用变量
3.赋值时使用(``反撇在tab上面)命令替换,提取命令执行后的输出结 果 和$( ) 用法相同
4.{}可以分隔变量值
单引号不识别 变量
双引号可以识别变量
{} 可以确定变量的范围
`` $() 调用命令执行的结果
变量追加值
格式:
title=cto
title+=ylc
变量名+=追加名
修改变量环境
[root CXK /opt] PATH+=:/opt
3.3 从键盘输入的内容变成变量(read -p)
3.4 变量作用范围
默认情况下,新定义的变量被称为局部变量,因为它们只在当前 shell 环境中有效。一旦进入子程序或新的 shell 环境,局部变量就不再起作用了。
可以使用内部命令 export 将用户定义的变量变为全局变量,这样用户定义的变量就可以在所有子 shell 环境中继续使用。
解决办法:格式1:export 变量名
格式2:export 变量名=变量值
定义全局变量
3.5 整数运算
expr只能进行整数的运算
格式: expr 变量1 运算符 变量2 [运算符 变量3]
运算符:
加法 +
减法 -
乘法 \ *
除法 /
取余 (取模)%
(1) let var=算术表达式
let sum=2*3
(2) $((var=算术表达式)) 和上面等价
((sum=1+9))
echo $sum
(3) var= $[算术表达式]
(4) var=$(expr arg1 arg2 arg3 ...)
(5) var= `expr arg1 arg2 arg3 ...`
(6) echo '算术表达式' | bc
3.6 环境变量
env可以看到所有变量
$USER 表示用户名称$HOME 表示用户的宿主目录$LANG 表示语言和字符集$PWD 表示当前所在工作目录$PATH 表示可执行用户程序的默认路径
环境变量的全局配置文件:/etc/profile
只用于单个用户:~/.bash_profile
vim /etc/profile
source /etc/profile
//使用source立即生效
3.7 位置变量
位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示
vim 1.sh
bash 1.sh
echo "$0"代表本身
3.8 预定义变量
$*:表示所有位置参数的内容看成一个整体返回 返回所有
$@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
$?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
$#:表示命令行中位置参数的总个数
$0:表示当前执行的脚本或程序的名称 当前脚本的名字
$$:当前bash的进程id
$!: 后台任务最后一个id
vim 1.sh
vim 2.sh
vim 3.sh
总结:
Shell 脚本描述规范:
(1) 脚本声明:#!/bin/bash。
(2) 注释信息:第一行以 # 号开头,定义了注释信息;注释行的内容不执行;
(3) 执行语句:描述要执行的脚本代码;
执行 Shell 脚本:
(1) 使用绝对路径/相对路径指定要执行的脚本文件。 脚本在子外壳环境中执行;
(2) 使用 bash/sh 程序指定要执行的脚本文件。 这不需要执行权限,脚本会在子壳环境中执行; (3) source/。 指定要运行的脚本文件,脚本将在当前 shell 环境中执行(影响当前目录、变量值等);