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