一·故事背景
shell脚本是很常用的工具,作为以后经常使用的“利器”,前面的基础知识要巩固,前期到语法之前的常用命令要知道,不然会影响以后的脚步编写。
二·前言
编程语言分类
静态和动态语言:
-
静态编译语言:使用变量前,先声明变量类型,之后类型不能改变,在编译时检查,如Java语言、C语言
-
动态编译语言:不事先声明,可随时改变类型,如Shell语言、python语言、javascript语言、php语言
强类型和弱类型语言:
-
强类型语言:不同类型数据操作,必须经过强制转换成同一类型才能运算,如java,C#
-
弱类型语言:语言的运行时会隐式地做数据类型转换。无需指定类型,默认均为字符型;参与计算会自动进行隐式类型转换;变量无需事先定义可直接调用。如Shell语言,php,JavaScript
脚本检查工具:
yum install -y epel-release
yum install -y ShellCheck
三·Shell脚本语言的基本结构
1·Shell脚本的用途:
-
自动化常用命令
-
执行系统管理和故障排除
-
创建简单的应用程序
-
处理文本或文件
2· Shell脚本基本结构:
Shell脚本编程:是基于过程式,解释执行的语言
编程语言的基本结构:
-
各种系统命令的组合
-
数据存储:变量,数组
-
表达式:a+b
-
控制语句:if、case、for、while
shell脚本:包含一些命令或声明,并符合一定格式的文本文件
格式要求:首行执行shebang机制
#声明后续语句是通过哪种语言写的
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
3· 创建Shell脚本过程
使用vim创建文本文件,第一行必须包括shell声明序列:
#!/bin/bash
加执行权限,给予执行权限,在命令行上指定脚本的绝对或相对路径

运行脚本,直接运行解释器,将脚本作为解释器程序的参数运行。

4· 脚本注释规范
-
第一行一般为调用使用的语言
-
程序名,避免更改文件名为无法找到正确的文件
-
版本号
-
更改后的时间
-
作者相关信息
-
该程序的作用,及注意事项
-
最后是各版本的更新简要说明
5·编写一个脚本

6·执行脚本
a.增加执行权限,执行脚本时会创建一个子shell,不影响现有的shell环境
chmod +x sh
./sh
/root/shellScript/sh
b.使用 . 或者source,执行脚本时不会创建一个子shell,会影响现有的shell环境
source sh
. sh#注意:尽量不要使用该方式执行脚本
7·脚本错误
-
语法错误,会导致后续的命令不继续执行,可以用bash -n shellname检查错误
-
命令错误,后续的命令还会继续,可以使用bash -x shellname检查
-
逻辑错误,只能使用bash -x进行观察
四·Shell脚本语言的变量用法详解
1·变量
变量表示命名的内存空间,将数据放在内存空间中,通过变量名引用,获取数据
2·变量类型
变量类型:
-
内置变量:如PS1,PATH,UID,HOSTNAME,HISTSIZE
-
用户自定义变量
-
预定义变量
-
位置变量
不同的变量存放的数据不同,决定了以下:
-
数据存储方式
-
参与的计算
-
表示的数据范围
变量数据类型:
-
字符串
-
数值:整型,浮点型(小数)、bash不支持浮点数
3· Shell中变量命名法则
-
不能使用程序中的保留字,如:if,for
-
只能使用数字,字母及下划线,且不能以数字开头
-
见名思意,用英文名字,并体现真正含义
-
统一命名规则:驼峰命名法
-
全局变量名大写
-
局部变量小写
-
函数名小写
4·变量定义和引用
变量的生效范围(变量作用域)
-
普通变量:生效范围为当前shell进程;对当前shell之外的其他shell进程,包括当前shell的子shell进程均无效
-
环境变量:生效范围为当前shell进程及其子进程
-
本地变量:生效范围为当前shell进程中某代码片段,通常指函数
变量赋值:
name="value"
value可以是以下多种类型
直接字符串:name='root'
变量引用:name="$USER"
命令应用:name=`command` || name=$(command)
通配符:FILE=/etc/* /*表示etc目录下所有的文件名*/##注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存。
变量引用:
$name
${name}
弱引用和强引用:
-
“$name”:弱引用,其中的变量引用会被替换成为变量值
-
‘$name’:强引用,其中的变量引用不会被替换成变量值,而保持原字符串

查看已定义的所有变量:


删除变量

5· 环境变量
环境变量:
-
可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量。
-
一旦子进程修改了从父进程继承的变量,将会传递新的值给孙子进程
-
一般只在配置文件中使用,在脚本中较少使用
declare命令详解:
declare 为 shell 指令,在第一种语法中可用来声明变量并设置变量的属性([rix]即为变量的属性),在第二种语法中可用来显示 shell 函数。若不加上任何参数,则会显示全部的 shell 变量与函数(与执行 set 指令的效果相同)
declare [+/-][rxi][变量名称=设置值] 或 declare -f
参数说明:
-
+/- "-“可用来指定变量的属性,”+"则是取消变量所设的属性。
-
-f 仅显示函数
-
r 将变量声明为只读变量。注意,一旦设置为只读变量,既不能修改变量的值也不能删除变量,甚至不能通过+r取消只 读属性
-
x 指定的变量会成为环境变量,可供shell以外的程序来使用
-
i 将变量声明为整数型(integer)
-
p 显示指定变量的被声明类型。
6·只读变量
只读变量:只能声明定义,但后续不能修改和删除
声明只读变量:
readonly name
declare -r name
查看只读变量:
readonly [-p]
declare -r
7、位置变量
位置变量:在Bash Shell中内置的变量,在脚本代码中调用命令行传递给脚本的参数
| 符号 | 含义 |
| $1,$2,. | 对应第一个,第二个等参数,shift[n]换位置,最多9个 |
| $0 | 命令本身,包括路径 |
| $* | 传递给脚本的所有参数,全部参数合成一个字符串 |
| $@ | 传递给脚本的所有参数,每个参数为独立字符串 |
| $# | 传递给脚本的参数的个数 |
| $? | 上个命令的退出状态,或函数的返回值 |
| $$ | 当前shell进程ID。对于Shell脚本,就是这些脚本所在的进程ID |
注意:$@,$*只有被双引号括起来的时候才会有差异
清空所有位置变量
set --
//写在脚本内部
8·退出状态码变量
进程执行后,将使用变量 ? 保存状态码的相关数字,不同的值反应成功与失败, ?保存状态码的相关数字,不同的值反应成功与失败, ?保存状态码的相关数字,不同的值反应成功与失败,的取值范围为[0,255]
$?的值为0 代表成功
$?的值不为0 代表失败(一般情况)
用户可以在脚本中使用以下命令自定义退出状态码
exit [n]
注意:
-
脚本中一旦遇到了exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
-
如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
exit表示退出当前 Shell 进程,我们必须在新进程中运行 test.sh,否则当前 Shell 会话(终端窗口)会被关闭,我们就无法取得它的退出状态了
9·展开命令行
a.展开命令执行顺序
把命令行分成单个命令词
^
展开别名^
展开大括号的声明{}^
展开波浪符声明(~)^
命令替换$()和``
^
再次把命令行分成命令词
^
展开文件通配(*,?,[abc]等)
^
准备I/O重导向(<,>)
^
运行命令
b. 防止扩展
反斜线(\)会使随后的字符按原意解释

c.加引号来防止扩展
单引号(' ')防止所有扩展
双引号(" ")可防止扩展,但是以下清空例外:$(美元符号)
d.变量扩展
``:反引号,命令替换
\:反斜线,禁止单个字符扩展
!:叹号,历史命令替换
10·脚本安全和set
set命令:可以用来定制shell环境
a. $-变量
-
h:hashell,打开选项后,Shell会将命令所在的路径hash下来,避免每次都要查询。通过set +h将h选项关闭.默认开启
-
i:interactive-comments,包含这个选项说明当前的shell是一个交互式的shell。所谓的交互式shell,在脚本中,i选项是关闭的
-
m:monitor,打开监控模式,就可以通过Job control来控制进程的停止,继续,后台或者前台执行等
-
B:braccexpand,大括号扩展
-
H:history,H选项打开,可以展开历史列表中的命令,可以通过
!来完成,例如!!返回最近的一个历史命令,!n返回第n个历史命令
b.set命令实现脚本安全
-
-u:在扩展一个没有设置的变量时,显示错误信息,等同于set -o nounset
-
-e:如果一个命令返回一个非0退出的状态值(失败)就退出,等同于set -o errexit
-
-o:option 显示,打开或关闭选项
-
显示选项:set -o
-
打开选项:set -o 选项
-
关闭选项:set +o 选项
-
-
-x:当执行命令时,打印命令及其参数,类似bash -x
五· Shell字符串详解
字符串(String)就是一系列字符的组合。字符串是Shell编程中最常用的数据类型之一
字符串可以由单引号''包围,也可以由""包围,也可以不用引号,三种方式的区别
-
由单引号
' '包围的字符串-
任何字符都会原样输出,在其中使用变量是无效的
-
字符串中不能出现单引号,即使对单引号进行转义也不行
-
-
由双引号
" "包围的字符串-
如果其中包含了某个变量,那么该变量就会被解析(得到该变量的值),而不是原样输出
-
字符串中可以出现双引号,只要进行转义就行
-
-
不被引号包围的字符串
-
不被引号包围的字符串中出现变量也会被解析,这一点和双引号
""包围的字符串一样 -
字符串中不能出现空格,否则空格后面的字符串会作为其他变量或者命令解析
-

str1 中包含了$n,它被解析为变量 n 的引用。$n后边有空格,紧随空格的是 str2;Shell 将 str2 解释为一个新的变量名,而不是作为字符串 str1 的一部分
str2 中包含了引号,但是被转义了(由反斜杠\开头的表示转义字符)。str2 中也包含了$n,它也被解析为变量 n 的引用
str3 中也包含了$n,但是仅仅是作为普通字符,并没有解析为变量 n 的引用
获取字符串长度

1·Shell字符串拼接
在脚本语言中,字符串的拼接(也称为字符串连接或者字符串合并)往往都非常简单,例如:
-
在
PHP中使用.即可连接两个字符串 -
在
JavaScript中使用+即可将两个字符串合并为一个
然而,在Shell中你不需要使用任何运算符,将两个字符串并排放在一起就能实现拼接

2·Shell字符串截取
Shell截取字符串通常有两种方式,从指定位置开始截取和从指定字符(子字符串)开始截取
从指定位置开始截取
这种方式需要两个参数:除了指定起始位置,还需要截取长度,才能最终确定要截取的字符串
既然需要指定起始位置,那么就要涉及到计数方向的问题,到底是从字符串左边开始计数,还是从字符串右边开始计数?答案是:Shell同时支持两种计数方式
| 格式 | 说明 |
|---|---|
| ${string:start :length} | 从string字符串的左边第start个字符开始,向右截取length个字符。 |
| ${string:start} | 从string字符串的左边第start个字符开始截取,直到最后。 |
| ${string:0-start:length} | 从string字符串的右边第start个字符开始,向右截取length个字符。 |
| ${string:0-start} | 从string字符串的右边第start个字符开始截取,直到最后。 |
| ${string#*chars} | 从string字符串第一次出现chars的位置开始,截取chars右边的所有字符。 |
| ${string##*chars} | 从string字符串最后一次出现chars的位置开始,截取chars右边的所有字符。 |
| ${string%chars*} | 从string字符串第一次出现chars的位置开始,截取chars左边的所有字符。 |
| ${string%%chars*} | 从string字符串最后一次出现chars的位置开始,截取chars左边的所有字符。 |
4·Shell的格式化输出printf
a.语法格式:
printf "指定的格式" "文本1" "文本2" .....
b.常用格式替换符:
| 替换符 | 功能 |
|---|---|
| %s | 字符串 |
| %f | 浮点格式,保留小数点位数%.nf,n为数字 |
| %b | 相对应的参数中包括转义字符时,可以使用此替换符进行替换,对应的转义字符会被转义 |
| %c | ASCII字符,即显示对应参数的第一个字符 |
| %d,%i | 十进制整数 |
| %o | 八进制值 |
| %u | 不带正负号的十进制值 |
| %x | 十六进制值(a-f) |
| %X | 十六进制值(A-F) |
| %% | 表示%本身 |
说明:%s中的数字代表此替换符中的输出字符宽度,不足补空格,默认是右对齐,%-10s表示10个字符宽,-表示左对齐
c.常用转义字符:
| 转义符 | 功能 |
|---|---|
| \a | 警告字符,通常为ASCII的BEL字符 |
| \b | 后退 |
| \f | 换页 |
| \n | 换行 |
| \r | 回车 |
| \t | 水平制表符 |
| \v | 垂直制表符 |
| \\ | 表示\本身 |
五·Shell脚本语言的运算
1· 算数运算
shell支持算术运算,但只支持整数,不支持小数
2·Bash中的算术运算
| 运算符号 | 含义 |
| + | 加法运算 |
| - | 减法运算 |
| * | 乘法运算 |
| / | 除法运算 |
| % | 取模,即取余数 |
| ** | 乘方 |
3·实现算术运算
1. let var=算术表达式
2. var=$[算术表达式]
3. var=$((算术表达式))



最低0.47元/天 解锁文章
1780

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



