Shell 脚本基础
一、Shell 入门简介
什么是 shell
Shell 通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出,简单来说 Shell 就是一个用户跟操作系统之间的一个命令解释器。
shell 本质上是 Linux 命令,多条命令组合在一起,实现某一目的,就构成了 shell 脚本
shell 编程注意事项
脚本命名:一般为英文字母、数字、下划线组成,以
.sh
为后缀脚本首行需要以
#!/bin/bash
开头脚本变量不能以数字、特殊符号开头,可以使用英文字母、下划线
在linux下编写shell脚本,赋予权限即可运行。如果是在windows下编写,有时候会报错, 原因是windows系统下换行符为
\r\n
,linux下换行符为\n
,所以导致在windows下编写的文件会比linux下多回车符号\r
,这种情况可以使用以下方法解决:
用 vim 来重新编辑脚本,首先查看文件格式:
在底行模式下输入 set ff,回车可以看到文件格式为 dos
;
底行模式下输入 set ff=unix ,修改文件格式为 unix
后保存退出即可。
Hello World 实战
1 |
|
二、Shell 变量详解
shell 编程中常见变量一般分为三种:系统变量、环境变量和用户变量
系统变量
主要是用于 对参数判断和命令返回值判断 时使用,详解如下:
1 |
|
环境变量
主要是在程序运行时需要设置,详解如下:
1 |
|
用户变量
用户变量又称为局部变量,主要用在Shell脚本内部或者临时局部使用,详解如下:
1 |
|
三、Shell 流程控制
1. if 条件语句
基本使用
通常以 if
开头,fi
结尾,也可加入else
或者elif
进行多条件的判断
1 |
|
常见逻辑判断运算符
1 |
|
实例 — 判断学生成绩等级
1 |
|
2. for 循环语句
1 |
|
实例 — 打印数字 1-10
1 |
|
3. while 循环语句
1 |
|
实例 — 求和数字 1-10
1 |
|
4. case 选择语句
对多个选择条件进行匹配输出,通常用于脚本传递输入参数,打印出输出结果及内容
1 |
|
实例 — 模式选择
1 |
|
5. select 选择语句
类似于 for 循环,常用于选择菜单的创建,可以配合 PS3 来做打印菜单的输出信息
1 |
|
实例 — 菜单选择
1 |
|
四、Shell 计算方式
1. expr 命令
expr
命令可以处理 算数表达式 、字符串表达式 以及 逻辑表达式,实现数值运算,进行数值或字符串的比较,字符串的匹配、提取、统计长度,甚至可以判断变量或参数是否为整数、是否为空、是否为0等,十分强大。
1. 处理算数表达式
- 只能处理整数运算,并且算术表达式优先级低于字符串表达式,高于逻辑关系表达式;
+
、-
、*
、/
、%
操作符的两边都要用空格隔开。并且需要注意一些特殊的字符,例如*
、/
、()
等等。这些字符在shell中有特殊含义,需要使用\
进行转义或者''
包围
1 |
|
2. 处理字符串表达式
expr STRING : REGEX
等价于expr match STRING REGEX
;
两个参数都会被视为字符格式,第二个参数会被作为正则表达式解释,并且它默认隐含前缀 ^
1 |
|
expr substr STRING POSITION LENGTH
返回STRING字符串中从POSITION开始,长度最大为LENGTH的字符串子串。如果POSITION或LENGTH为负数、0或非数值,则返回空字符串
1 |
|
expr index STRING SUBSTR
SUBSTR中任意单个字符在STRING中最前面的字符位置。如果在STRING中完全不存在SUBSTR中的字符,则返回0
1 |
|
expr length STRING
返回STRING的字符数
1 |
|
3. 处理逻辑表达式
- 除了
|
和&
,其余的逻辑符号在表达式为真时,返回 1,否则返回 0 |
和&
在使用时都需要转义\
或用引号''
括起来
1 |
|
2. $[operation]
$[]
符号的方便之处在于它对方括号内的空格无太严格的要求,同时方括号内的运算符不需要进行转义,但是它依旧只能处理整数运算
1 |
|
3. let 命令
let命令属于内建命令,执行它的开销要少于上面两种,并且还提供了求幂运算符**
、自加自减等, 使用let命令时需要注意一些细节:
- let 表达式内变量不用加
$
- 运算符两边不可以有空格,有的话就必须用单引号或者双引号括起来
- let 后面必须是赋值表达式,即为变量赋值
1 |
|
4. 使用双括号 (())
(())
也属于内建命令,并且依然只支持整型计算,双括号内的运算符不需要进行转义, 常用来计算并测试算术表达式,搭配c风格的 for,while,if 等
1 |
|
五、其他命令
1. nohup 命令
nohup
英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out
的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。
1 |
|
参数说明:
Command
:要执行的命令;Arg
:一些参数,可以指定输出文件;&
:让命令在后台执行,终端退出后命令仍旧执行。
实例
在后台执行 root 目录下的 test.sh 脚本,并追加输入到 /data/log/test.log 文件中
1 |
|
接下来,我们再看一个,将jar包在后台执行且将标准输出和标准错误输出都重定向到 log 中
1 |
|
这里的
2>&1
含义可参考: Linux shell中2>&1的含义解释