从零开始的云计算生活——第十五天,翻山越岭,Shell脚本。

一·故事背景

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

  • 用户自定义变量

  • 预定义变量

  • 位置变量

不同的变量存放的数据不同,决定了以下:

  1. 数据存储方式

  2. 参与的计算

  3. 表示的数据范围

变量数据类型:

  • 字符串

  • 数值:整型,浮点型(小数)、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编程中最常用的数据类型之一

字符串可以由单引号''包围,也可以由""包围,也可以不用引号,三种方式的区别

  1. 由单引号' '包围的字符串

    • 任何字符都会原样输出,在其中使用变量是无效的

    • 字符串中不能出现单引号,即使对单引号进行转义也不行

  2. 由双引号" "包围的字符串

    • 如果其中包含了某个变量,那么该变量就会被解析(得到该变量的值),而不是原样输出

    • 字符串中可以出现双引号,只要进行转义就行

  3. 不被引号包围的字符串

    • 不被引号包围的字符串中出现变量也会被解析,这一点和双引号""包围的字符串一样

    • 字符串中不能出现空格,否则空格后面的字符串会作为其他变量或者命令解析

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=$((算术表达式))

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值