Shell 脚本基础
约 1548 个字 237 行代码 9 张图片 预计阅读时间 8 分钟
Info
本章的 Shell 脚本,如无特别说明,均指 Bash。
Shell 脚本的作用
- 把多条命令放在一起执行,执行一次可以执行多条命令
- 添加了数组、循环、条件、逻辑判断等功能,能够执行复杂的操作
运行脚本
直接执行 Shell 脚本
前提:用户对脚本有 rx 权限。
一般可直接输入脚本路径,默认会使用当前 Shell 执行(之后说具体情况):
如果脚本在当前目录下,务必加 ./,不能直接写文件名:
也适用于其他的可执行程序。
指定 Shell 执行 Shell 脚本
不需要脚本有 x 权限,但至少有 r 权限。
如果脚本在当前目录,不需要再加 ./,如:
source 或 .
不需要脚本有 x 权限,但至少有 r 权限。
与其他方式的区别:其中定义的变量在此次 bash 进程中会保留下来。
注释
一般的注释
以 # 开头,在一行内生效。
也可以将命令屏蔽掉。
特殊的注释:shebang
形如:
放在第一行,必须写绝对路径。
用来告诉 Shell ,脚本由谁来执行,不一定是 Shell;写了之后可以直接执行:
但不是所有命令都会忽略注释,包括 shebang,如上例的执行结果:
与 env 搭配使用
上例考虑到 bash 可能不在 /bin 下,比较保险的写法:
如果要使用的命令带选项,应该给 env 加上 -S 选项:
输入、计算
read - 输入
变量名本身不用加 $,下同。
如不指定变量名,则会放在 REPLY 变量中。
选项:
-p 文字:提示文本-t 整数:等待的秒数,如等待期间无输入,则跳过,变量名会赋为空值,返回值非0
直接计算
仅支持整数四则运算、取余、括号(+ - * / % ( )),除法仅取整数部分。
可使用如下格式:
例:
bc - 简单的计算器
不指定文件,则进入交互模式。
选项:
-l:加载数学库,支持更多命令
支持的命令
Info
只列举一部分,详细的可参考手册。
- 整数与小数的四则运算、取余、括号:
+-*/%() - 幂
- 变量定义
- 特殊变量
- 自操作
- 判断大小:为真为
1,否则为0 - 逻辑运算:返回
0或1 - 常用方法
- 添加
-l选项后支持的一些函数
例
求 π 值:
判断式
test - 判断
直接执行无显示,需看返回值:0 为真,1 为假。
选项
单个文件判断
-
文件类型判断
-e:是否存在-s:是否存在且非空- 是否存在且为某类型的文件
-b-c-d-p-f-L/-h-S块设备 字符设备 目录 管道 普通文件 符号链接 套接字 -
文件权限检测:是否存在且有对应权限
-r |
-w |
-x |
-u |
-g |
-k |
|---|---|---|---|---|---|
| 读 | 写 | 执行 | SUID | SGID | SBIT |
两个文件比较
-nt:(newer than)前面的文件是否比后面的文件新-ot:(older than)前面的文件是否比后面的文件旧-ef:两个文件是否是一个文件(看是否指向同一个 inode)
两个整数判定
| 选项 | 全称 | 含义 |
|---|---|---|
-eq |
equal | == |
-ne |
not equal | != |
-gt |
greater than | > |
-lt |
less than | < |
-ge |
greater than or equal | >= |
-le |
less than or equal | <= |
字符串判定
- 单个字符串
-z:字符串长度是否为0(是否为空字符串),若空为0(真)-n或省略:字符串长度是否非0(是否非空字符串) ,若空为1(假)
- 多个字符串
==!=
多重条件
-a:与-o:或!:非
简写
注意条件两端以及条件内的判断符两边都要有空格;变量最好用双引号包裹,以免出现其中带空格的情况。
流程结构
条件结构
if
Shell 中 0 为真,非 0 为假。
elif 块可以写多个。
case / switch
值1) 块可以写多个。
循环结构
while
条件成立时进行循环,直到不成立为止。
until
进行循环,直到条件成立为止。
for
使用序列
给变量名分别赋不同值进行循环。
上面的 值1 值2 值3 被称为序列。序列一般可以用空格或换行符分割,但后者一般只用在变量中。
序列的生成
想要生成 1~100 的序列,可以用:
用在 for 中如下:
后者的形式也可以用于字母:
不使用序列
一般会在循环前赋值,条件和循环后操作都会操作值。
函数、返回值与参数
函数定义与调用
一般的定义方式:
最简单的定义方式:
函数可以给返回值,写在代码段中:
一般的调用方式:
带参数的调用方式:
取函数执行完后的返回值:
函数的参数
$#:参数个数$*:作为字符串输出所有参数,分隔符默认为空格$@:作为数组输出所有参数(可用作序列)${数字}:第几个参数(从1开始,10以下可以不用大括号)
例:
shift - 参数变量号偏移
例:
函数体中使用 shift 语句之后:
Shell 脚本的默认变量
也适用偏移。
脚本的返回值
辅助功能与补充
Shell 的选项
选项:
-n:不执行脚本,仅查询语法问题-v:执行脚本前,输出脚本内容-x:将使用到的脚本内容先显示在屏幕上
例:
设 t.sh 内容如下:
执行 Shell 脚本时传入变量
在 Shell 脚本内包含其他 Shell 脚本
利用 source 或 .
随机数
环境变量 RANDOM 为整数,取值范围 0~32767。
将其转化为较小的 0~n 区间的一种方式:
日期时间
获取路径的目录部分和文件部分
该命令不检查文件是否存在,所以也可以作为分割字符串的方式。
参考资料
- 鸟哥的Linux私房菜. 基础学习篇 / 鸟哥著 ; Linux 中国繁转简. -- 4版. -- 北京 : 人民邮电出版社, 2018.3; ISBN 978-7-115-47258-8
- Linux就该这么学 / 刘遄著. -- 北京 : 人民邮电出版社, 2017.11; ISBN 978-7-115-47031-7
- Linux 教程 | 菜鸟教程
- 释伴:Linux 上的 Shebang 符号(#!)_Pikachu5808的博客-CSDN博客_shebang








