文章目录
一,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
每有一个参数循环一次(有三次循环)
脚本内容输出后:

本文详细介绍了Shell脚本的基础概念、应用场景,重点讲解了变量的定义、操作、命名规则,以及重定向和管道的使用。涵盖了自定义变量、输入输出重定向、环境变量和只读变量等内容,适合shell初学者和高级用户参考。
1059

被折叠的 条评论
为什么被折叠?



