1. shell 脚本语言的基本用法

1.1 shell 脚本的用途

将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率;

减少手工命令的输入,一定程度上避免人为错误;

将软件或应用的安装及配置实现标准化;

用于实现日常性的,重复性的,非交互式的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等;

1.2 shell 脚本基本结构

shell脚本编程:是基于过程式、解释执行的语言

编程语言的基本结构:

①各种系统命令的组合

②数据存储:变量、数组

③表达式:a + b

④控制语句:if

格式要求:首行shebang机制

1.3 shell脚本创建过程

第一步:使用文本编辑器来创建文本文件

第一行必须包括shell声明序列:#!

示例:

#!/bin/bash

添加注释,注释以#开头

第二步:加执行权限

给予执行权限,在命令行上指定脚本的绝对或相对路径

第三步:运行脚本

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

1.4 shell 脚本调试

只检测脚本中的语法错误,但无法检查出命令错误,但不真正执行脚本:

bash -n /path/to/some_script

调试并执行:

bash -x /path/to/some_script

脚本错误常见的有三种

①语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的;

②命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察;

③逻辑错误:只能使用 bash -x 进行观察;

2.1 变量

变量表示命名的内存空间,将数据放在内存空间中,通过变量名引用,获取数据

2.1.1 变量类型

①内置变量,如:PS1,PATH,UID,HOSTNAME,$$,BASHPID,PPID,$?,HISTSIZE

②用户自定义变量

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

①数据存储方式

②参与的运算

③表示的数据范围

变量数据类型:

①字符

②数值:整型、浮点型,bash 不支持浮点数

2.1.2 Shell中变量命名法则

2.1.2.1 命名要求

区分大小写

不能使程序中的保留字和内置变量:如:if, for

只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反

2.1.2.2 命名习惯

见名知义,用英文单词命名,并体现出实际作用,不要用简写,如:ATM

变量名大写

局部变量小写

函数名小写

大驼峰StudentFirstName

小驼峰studentFirstName

下划线: student_name

2.1.3 变量定义和引用

变量的生效范围等标准划分变量类型:

普通变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效;

环境变量:生效范围为当前shell进程及其子进程;

本地变量:生效范围为当前shell进程中某代码片断,通常指函数;

变量赋值:name='value'

value 可以是以下多种形式:

直接字串:name='root'

变量引用:name="$USER"

命令引用:name=COMMAND 或者 name=$(COMMAND)

注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚

本结束,也会自动删除

变量引用:

"$name" 弱引用,其中的变量引用会被替换为变量值

'$name' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串

范例:变量的各种赋值方式和引用





范例:变量引用



范例:变量的间接赋值和引用



范例:变量追加值



范例:利用变量实现动态命令

显示已定义的所有变量:set

删除变量:unset

2.1.4 环境变量

环境变量:

①可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量

②一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程

③一般只在系统配置文件中使用,在脚本中较少使用

变量声明和赋值:

声明并赋值

export name=VALUE

declare -x name=VALUE

或者分两步实现

name=VALUE

export name

变量引用:

$name

${name}

显示所有环境变量:

env

printenv

export

declare -x

查看指定进程的环境变量

cat /proc/$PID/environ

删除变量:

unset name

bash内建的环境变量

PATH

SHELL

USER

UID

HOME

PWD

SHLVL #shell的嵌套层数,即深度

LANG

MAIL

HOSTNAME

HISTSIZE

_   #下划线,表示前一命令的最后一个参数

2.1.5 只读变量

只读变量:只能声明定义,但后续不能修改和删除,即常量

声明只读变量:

readonly name

declare -r name

查看只读变量:

readonly [-p]

declare -r

2.1.6 位置变量

位置变量:在bash shell中内置的变量, 在脚本代码中调用通过命令行传递给脚本的参数。

$1, $2, ... 对应第1个、第2个等参数,shift [n]换位置

$0 命令本身,包括路径

$* 传递给脚本的所有参数,全部参数合为一个字符串

$@ 传递给脚本的所有参数,每个参数为独立字符串

$# 传递给脚本的参数的个数

注意:$@ $* 只在被双引号包起来的时候才会有差异

清空所有位置变量

set --

2.1.7 退出状态码变量

当我们浏览网页时,有时会看到下图所显示的数字,表示网页的错误信息,我们称为状态码,在shell脚

本中也有相似的技术表示程序执行的相应状态。



进程执行后,将使用变量 $? 保存状态码的相关数字,不同的值反应成功或失败,$?取值范例 0-255

$?的值为0 #代表成功

$?的值是1到255   #代表失败

用户可以在脚本中使用以下命令自定义退出状态码

exit [n]

注意:

①脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字

②如果exit后面无数字,终止退出状态取决于exit命令前面命令执行结果

③如果没有exit命令, 即未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

2.1.8 展开命令行

展开命令执行顺序

把命令行分成单个命令词

展开别名

展开大括号的声明{}

展开波浪符声明 ~

命令替换$() 和 ``

再次把命令行分成命令词

展开文件通配*、?、[abc]等等

准备I/0重导向 <、>

运行命令

防止扩展

反斜线(\)会使随后的字符按原意解释

加引号来防止扩展

单引号(’’)防止所有扩展

双引号(”“)也可防止扩展,但是以下情况例外:$(美元符号) 

变量扩展

`` : 反引号,命令替换

\:反斜线,禁止单个字符扩展

!:叹号,历史命令替换

2.1.9 脚本安全和 set

set 命令:可以用来定制 shell 环境

$- 变量

h:hashall,打开选项后,Shell 会将命令所在的路径hash下来,避免每次都要查询。通过set +h将h选项关闭;

i:interactive-comments,包含这个选项说明当前的 shell 是一个交互式的 shell。所谓的交互式shell,在脚本中,i选项是关闭的;

m:monitor,打开监控模式,就可以通过Job control来控制进程的停止、继续,后台或者前台执行等;

B:braceexpand,大括号扩展;

H:history,H选项打开,可以展开历史列表中的命令,可以通过!感叹号来完成,例如“!!”返回上最近的一个历史命令,“!n”返回第 n 个历史命令;

范例:



set 命令实现脚本安全

-u 在扩展一个没有设置的变量时,显示错误信息, 等同set -o nounset

-e 如果一个命令返回一个非0退出状态值(失败)就退出, 等同set -o errexit

-o option 显示,打开或者关闭选项

显示选项:set -o

打开选项:set -o 选项

关闭选项:set +o 选项

-x 当执行命令时,打印命令及其参数,类似 bash -x

范例:



范例:

DIR=/data

cd $DIR

rm -rf *

#rm -rf $DIr/*

2.2 格式化输出 printf

格式

printf "指定的格式" "文本1" ”文本2“……

常用格式替换符



说明:

%#s 中的数字代表此替换符中的输出字符宽度,不足补空格,默认是右对齐,%-10s表示10个字符宽,- 表示左对齐;

%03d 表示3位宽度,不足前面用0补全,超出位数原样输出;

%.2f 中的2表示小数点后显示的小数位数;

常用转义字符



范例:



#.2f 表示保留两位小数



#%-10s 表示宽度10个字符,左对齐



#将十进制的17转换成16进制数



#将十六进制C转换成十进制

2.3 算术运算

Shell允许在某些情况下对算术表达式进行求值,比如:let和declare 内置命令,(( ))复合命令和算术扩

展。求值以固定宽度的整数进行,不检查溢出,尽管除以0 被困并标记为错误。运算符及其优先级,关

联性和值与C语言相同。以下运算符列表分组为等优先级运算符级别。级别按降序排列优先。

注意:bash 只支持整数,不支持小数



乘法符号有些场景中需要转义

实现算术运算:

(1) let var=算术表达式

(2) ((var=算术表达式)) 和上面等价

(3) var=$[算术表达式]

(4) var=$((算术表达式))

(5) var=$(expr arg1 arg2 arg3 ...)

(6) declare -i var = 数值

(7) echo '算术表达式' | bc

内建的随机数生成器变量:

$RANDOM   取值范围:0-32767

范例:

#生成 0 - 49 之间随机数

echo $[$RANDOM%50]

#随机字体颜色



增强型赋值:



格式:

let varOPERvalue



范例:

自加3后自赋值



范例:

自增,自减



范例:

2.4 逻辑运算

true, false

1,真

0,假

与:& 和0相与结果为0,和1相与结果保留原值, 一假则假,全真才真

0 与 0 = 0

0 与 1 = 0

1 与 0 = 0

1 与 1 = 1

范例:



或:| 和1相或结果为1,和0相或结果保留原值,一真则真,全假才假

0 或 0 = 0

0 或 1 = 1

1 或 0 = 1

1 或 1 = 1

范例:



非:!

! 1 = 0   !  true

! 0 = 1 !  false

异或:^

异或的两个值,相同为假,不同为真。两个数字X,Y异或得到结果Z,Z再和任意两者之一X异或,将得出另一个值Y

0 ^ 0 = 0

0 ^ 1 = 1

1 ^ 0 = 1

1 ^ 1 = 0

范例:



范例: 变量互换

短路运算

短路与 &&

CMD1 短路与 CMD2

第一个CMD1结果为真 (1),第二个CMD2必须要参与运算,才能得到最终的结果

第一个CMD1结果为假 (0),总的结果必定为0,因此不需要执行CMD2

短路或 ||

CMD1 短路或 CMD2

第一个CMD1结果为真 (1),总的结果必定为1,因此不需要执行CMD2

第一个CMD1结果为假 (0),第二个CMD2 必须要参与运算,才能得到最终的结果

史上最全shell脚本编程语法上册的更多相关文章

  1. Shell 脚本编程 基本语法:

    Shell 脚本编程语法: 注: 文章来源 http://www.cnblogs.com/yunquan/p/6821850.html 视频来源:https://www.bilibili.com/vi ...

  2. WebClient (史上最全)

    疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 面试必备 + 面试必备 [博客园总入口 ] 疯狂创客圈 经典图书 : <Sprin ...

  3. Oracle 史上最全近百条Oracle DBA日常维护SQL脚本指令

    史上最全近百条Oracle DBA日常维护SQL脚本指令 https://mp.weixin.qq.com/s?__biz=MjM5MDAxOTk2MQ==&mid=2650281305&am ...

  4. 史上最全的LaTeX特殊符号语法

    史上最全的LaTeX特殊符号语法 运算符 语法 效果 语法 效果 语法 效果 + \(+\) - \(-\) \triangleleft \(\triangleleft\) \pm \(\pm\) \ ...

  5. 你想找的Python资料这里全都有!没有你找不到!史上最全资料合集

    你想找的Python资料这里全都有!没有你找不到!史上最全资料合集 2017年11月15日 13:48:53 技术小百科 阅读数:1931   GitHub 上有一个 Awesome - XXX 系列 ...

  6. Linux面试题(史上最全、持续更新、吐血推荐)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  7. IDEA HTTP Client(史上最全)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  8. GitHub上史上最全的Android开源项目分类汇总 (转)

    GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...

  9. SHELL脚本编程的常识和VI常用技巧

    来源:http://mprc.pku.edu.cn/mentors/training/TrainingCourses/material/ShellProgramming.HTM#_Toc3751808 ...

  10. [No00004F]史上最全Vim快捷键键位图(入门到进阶)vim常用命令总结

    在命令状态下对当前行用== (连按=两次), 或对多行用n==(n是自然数)表示自动缩进从当前行起的下面n行.你可以试试把代码缩进任意打乱再用n==排版,相当于一般IDE里的code format.使 ...

随机推荐

  1. openGauss资源池化开发者入门指南(一)

    openGauss资源池化开发者入门指南(一) 一.内容简介 openGauss 资源池化是 openGauss 推出的一种新型的集群架构.通过 DMS 和 DSS 组件,实现集群中多个节点的底层存储 ...

  2. ArkUI开发趣味体验,快来抽取限量HarmonyOS专属头像!

    本次ArkUI开发趣味体验活动,将手把手教大家如何在IDE里实操一个ArkUI程序,通过补充缺失代码,成功运行程序开启抽奖功能,抽取个人专属头像,做HarmonyOS第一批数字藏品家! 同时本期提供的 ...

  3. 基于eTS高效开发HarmonyOS课程类应用

    原文:https://mp.weixin.qq.com/s/kU76kB6T1JSqapAfGPGRHQ,点击链接查看更多技术内容. 随着HarmonyOS 3.0 Beta版的发布,API Vers ...

  4. Python-List内部实现

    Python有很大实现的版本,像拿C语言实现的Cpython,以及在其基础上改进其解释执行变为即时编译(jit)的Pypy,还有一些其他的比如Jpython等.具体来说 其中使用c语言开发的叫做pyt ...

  5. 新手的登录qsnctfwp

    打开登录界面 按要求以普通用户 user 的身份,通过密码 password 登录 使用 BurpSuite 拦截登录情况 在获取(GET)登录结果页面时,修改 Cookie 中的 username ...

  6. docker 应用篇————docker 的文件系统[十]

    前言 简单介绍一下docker的文件系统. 正文 docker 容器启动就是一个文件系统的启动. 在docker中,每一层镜像都具备一些文件. 比如说,有一个centos的镜像. 里面就是一个微小版的 ...

  7. 重新整理数据结构与算法(c#)——算法套路迪杰斯特拉算法[三十一]

    前言 迪杰斯特拉算法 是求最短路径方法的其中一种,这个有什么作用呢? 有一张图: 假设求G点到其他各点的最小路径. 是这样来的. 比如找到了和G点相连接所有点,ABED.这时候确定GA是一定是最短的, ...

  8. Android Studio制作简单登录界面

    实现目标 应用线性布局设计登录界面,要求点击输入学号时弹出数字键盘界面,点击输入密码时弹出字母键盘,出现的文字.数字.尺寸等全部在values文件夹下相应.xml文件中设置好,使用时直接引用.当用户名 ...

  9. Django框架——图书管理系统、聚合查询、分组查询、F与Q查询

    图书管理系统 1.表设计 先考虑普通字段再考虑外键字段 数据库迁移.测试数据录入 2.首页展示 3.书籍展示 4.书籍添加 5.书籍编辑 后端如何获取用户想要编辑的数据.前端如何展示出待编辑的数据 6 ...

  10. Qt 从 QTransform 逆向解出 Translate/Scale/Rotate(平移/缩放/旋转)分析

    QTransform 用于图形绘制,它定义了如何平移(translate).缩放(scale).切变(shear).旋转(rotate)或投射(project)坐标系.注意:QTransform 是作 ...