文章目录
一,Shell 脚本概述
1.1 shell 脚本的概念
- 将要执行的命令按顺序保存到一个文本文件
- 要给该文件可执行权限
- 可以结合各种Shell 控制语句以完成更复杂的操作
1.2 Shell 脚本应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
- …
1.3 Shell 的作用
Shell --命令解释器,介于系统内核与用户之间,一种被称为解释性语言或者脚本语言的计算机语言。充当“翻译官”的作用
Linux 系统中运行的一种特殊程序,用户登录Linux系统时,自动加载一个Shell程序
Linux 系统中默认使用的Shell程序时Bash,文件位于 /bin/bash
不同Shell 的内部指令,运行环境会有区别
1.4 Shell 基本的构成
- 脚本声明
- 注释信息
- 可执行语句
我们新建一个脚本用.sh结尾命名
给他一个可执行权限
1.5 脚本的执行
bash test.sh
文件名直接执行(绝对路径或者相对路径执行)
source text.sh或 . test.sh执行
1.6 上述执行方法的区别
bash +脚本名:新开了一个bash环境,然后在这个新的bash环境中运行脚本内程序
文件名直接执行:这个方法是将脚本作为一个可执行程序,所以,要写脚本的绝对路径或者相对路径。由于脚本本身作为可执行程序,所以,会创建名为脚本名(test.sh) 的子进程
source或者点 " . ": 这两个命令都是在当前 shell 环境下,使用当前的解释器读取并执行命令,不会新开一个shell 环境或者 其他的子进程。由于这两个命令都是将 脚本作为参数,所以,不需要脚本有 执行权限x
将之前的脚本内容修改,加上 ‘sleep 1000’
用pstree命令查看进程树
bash运行脚本后,打开另一个终端,查看进程树
用bash命令新开了一个bash环境执行了脚本
用./tesh.sh运行脚本后,查看进程树
可以看到新开了一个tesh.sh的子进程,子进程下面有sleep进程
source text.sh运行脚本
是直接在当前bash环境下执行sleep进程
1.7 重定向操作
1.7.1交互式硬件设备
- 标椎输入: 从该设备接收用户输入的数据
- 标椎输出:通过该设备向用户输出数据
- 标椎错误输出:通过该设备报告执行出错信息
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标椎输入 | /dev/stdin | 0 | 键盘 |
标椎输出 | /dev/stdou | 1 | 显示器 |
标椎错误输出 | /dev/stderr | 2 | 显示器 |
1.7.2 重定向操作
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取,而不是从键盘输入 |
覆盖重定向输出 | > 或者 1> | 将正确的输出的结果保存到指定文件(覆盖原有内容) |
追加重定向输出 | >> 或者 1>> | 将正确的输出的结果保存到指定文件(追加在文件尾部) |
覆盖标椎错误输出 | 2> | 将错误的输出的结果保存到指定文件(覆盖原有内容) |
追加标椎错误输出 | 2>> | 将错误的输出的结果保存到指定文件(追加在文件尾部) |
覆盖混合输出 | &> | 将标准输出,标准错误的内容保存到同一文件(覆盖原有内容) |
追加混合输出 | &>> | 将标准输出,标准错误的内容保存到同一文件(追加在文件尾部) |
操作符 | 用途 |
---|---|
>&2 或者 1>&2 | 将标准输出重定向到标准错误(即,让正确输出可以被 2> 收集) |
2>&1 | 将标准错误输出重定向到标椎输出(即,让错误的输出可以被 > 收集) |
1,重定向输入
创建文件a,输入内容123
[root@caoyuzhou ~]# cat < a abc #以文件a为输入设备
[root@caoyuzhou ~]# cat a abc #以键盘为输入设备
其表示意义不一样
2,标准重定向输出
如果前面命令返回值为0(即,命令正确),则将结果重定向输出到指定文件
返回值: 命令运行正确,则返回值为0 .命令运行错误,则返回非 0 值。可以用echo $? 查看上一条命令的返回值
ls +是我乱输的,echo返回值为非0,表示不成功
3,标椎错误输出
接收错误输出的信息(命令返回值为 非0 值),重定向到指定文件
可以看到返回值还是2
1.8 管道操作符号
管道操作符号“|”,将左侧命令输出结果,作为右侧命令的处理对像
命令1 | 命令2 【……|命令n】
管道符号加上xargs 可将前面的结果作为参数输出给后面的命令
如果不加管道符号,则会删除失败
并且用echo $?查看是执行成功的
二,Shell 脚本变量
2.1 变量概述
2.1.1 定义:
变量就是会变的量。可以通过变量名得到变量值。在内存上开辟一个记录数据的空间,给它起个名字,如name,num 等,这些就是变量名。而存放在该空间的数据就是变量的值。
2.1.2 变量的格式
变量名=变量值
2.1.3 变量命名规则
- 变量名必须是以字母或下划线开头,名字中间只能由字母,数字,下划线"_" 组成,不能有小数点,特殊字符,空格,标点符号等。
- 变量名的长度不得超过255 个字符。
- 变量名在有效范围内必须是唯一的。
- 变量名不能和系统命令,系统变量等冲突。
- 变量名可以将开头字母打下,以防和系统命令等冲突。
2.1.4 查看变量名
用echo $变量名,查看变量的值
使用set查看当前Shell里所有变量
2.2 自定义变量
删除变量格式:
unset 变量名
三种引号:
双引号 “”:允许通过$符号引用其他变量值,解释特殊符号 的释义
单引号’‘:禁止引用其他变量值, $视为普通字符,不解释
反撇号 `:命令替换,可执行命令并提取输出后的结果,与 $( )作用相同
2.3从键盘输入内容为变量赋值
read 【-p “提示信息”】变量名
2.4 设置变量的作用范围
格式:
export 变量名
export 变量名=变量值
局部变量:
直接设置的变量是局部变量,只在当前shell 环境生效,如果重开终端,或者开启一个新的shell 环境,或者登陆其他用户账号,则变量失效
bash:切换一个新的bash环境
那么如何设置全局都有呢
注意,变量为单个字符会失效
同样这个单个字符也会失效
2.5 整数变量的运算
2.5.1 expr 进行运算
expr 变量1 运算符 变量2 【运算符 变量3……】
常用运算符:
- 加法:+
- 减法:-
- 乘法:*
- 除法:/
- 求模(取余)运算:%
同时遵循数学法则先乘除后加减
$[ ]为数学中的括号功能
同时也可以用变量运算
echo $(( ))可以直接运算,带入变量同理
2.6环境变量
定义: 由系统提前创建,用来设置用户的工作环境
2.6.1设置环境变量
配置文件: /etc/profile , ~/bash_profile
/etc/profile : 针对全局的设置
~/bash_profile : 只对该用户生效
常见的环境变量:
环境变量 | 释义 |
---|---|
PATH | 指定命令的搜索路径(linux 根据PATH 的值搜索命令) |
HOME | 当前用户的家目录 |
HISTSIZE | 历史命令最大条数 |
LOGNAME | 当前登录用户名 |
USER | 当前用户名 |
SHELL | 当前用户使用的shell环境 |
HOSTNAME | 当前主机名 |
PWD | 当前目录名 |
查看环境变量:
env #显示当前所有的环境变量
2.7 只读变量
该变量只能使用,无法修改其变量值,放在内存的只读区域
适用于变量值不允许修改的情况
格式:
readonly 变量名
而且是删都删不掉的!!!
2.8位置变量
2.8.1位置变量有哪些
变量 | 含义 |
---|---|
$ 0 | 当前脚本文件名 |
$ n | 第n个参数。用来传递给脚本或者函数 |
$ # | 传递给脚本或者函数的所有参数 |
$ * | 传递给脚本或函数的所有参数 |
$ @ | 传递给脚本或者函数的所有参数 |
$ ? | 上个命令,函数,的返回值。0为真,非0位假 |
$ $ | 当前shell 进程,脚本进程的PID |
建一个脚本来执行,名字为test.sh
2.8.2 $*和 $@的区别
" $ * " 与 " $@" 都是表示传递给函数或者脚本的所有参数。
当 $* 和 $@ 没有 加 双引号 " " 时,都是将接受到每一个参数,看成独立的数据
当 $* 和 $@ 加 双引号 " " 时 , $* 将所有的参数看成一个数据, $@ 依然将每个参数看成独立的参数
第一段:
将变量
∗
的
值
赋
给
a
每
有
一
个
参
数
循
环
一
次
(
只
有
一
次
循
环
)
第
二
段
:
将
*的值赋给a 每有一个参数循环一次(只有一次循环) 第二段: 将
∗的值赋给a每有一个参数循环一次(只有一次循环)第二段:将@的值赋给b
每有一个参数循环一次(有三次循环)
脚本内容输出后: