AI智能
改变未来

学习笔记 — shell脚本

早就听说过脚本,但没有具体的学习过,趁着此次备考实习,初步学习了一下(学习地址),(给的笔记)做一下总结:

一、shell介绍

目的: 让机器解决重复性问题。

什么是shell: 一个采用C语言编写的程序,是用户和linux内核沟通的桥梁。既是一种命令语言,又是一种解释性的编程语言。

二、 shell语法

如何写一个shell脚本: 将完成一个任务的所有的命令按照执行的先后顺序,自上而下写入到一个文本文件中,并给予执行权限。

2.1 规范

命名: 要有意义;虽然linux系统中,文件没有扩展名的概念,但建议用.sh结尾;名字不要太长,最好能在30个字节以内解决。

格式: 开头必须指定脚本运行环境 以 #!这个特殊符号组合来组成。如: #!/bin/bash 指定该脚本是运行解析由/bin/bash来完成的。

注释: #

shell脚本中,最好加入脚本说明字段(分别说明运行环境、作者、时间以及作用)#!#Author:#Created Time:#Script Description:

2.2 运行

脚本运行需要执行权限#chmod u+x filename如果不赋予脚本执行权限,那么可以使用bash命令来运行未给予执行权限的脚本#bash filename

2.3 特殊字符

字符 含义 举例/具体
~
家目录 #cd ~ 代表进入用户家目录
!
执行历史命令 !! 执行上一条命令
$
变量中取内容符
+
-
*
\\
%
对应数学运算 加 减 乘 除 取余数
&
后台执行
*
通配符 匹配所有
?
通配符 匹配除回车以外的一个字符
;
命令之间用分号分割
|
管道符 上一个命令的输出作为下一个命令的输入 cat filename
\\
转义字符
``
反引号 命令中执行命令 echo \”today is

date +%F

\”

\' \'
字符串单引号引起 不同于双引号的是,单引号不解释变量
\" \"
字符串双引号引起

2.4 特殊变量

符号 含义
$* 代表所有参数,其间隔为IFS内定参数的第一个字元
$@ 与*星号类同。不同之处在於不参照IFS
$# 代表参数数量
$ 执行上一个指令的返回值
$- 最近执行的foreground pipeline的选项参数
$$ 本身的Process ID
$ 执行上一个背景指令的PID
$_ 显示出最後一个执行的命令
$N shell的第几个外传参数

2.5 重定向

字符 含义 举例/具体
> 重定向输入 覆盖原数据
>> 重定向追加输入,在原数据的末尾添加
< 重定向输出 wc -l < /etc/passwd
<< 重定向追加输出 fdisk /dev/sdb <<EOF … EOF

2.6 数学运算

expr 命令:只能做整数运算,注意空格[root@baism ~]# expr 1 + 12[root@baism ~]# expr 5 - 23[root@baism ~]# expr 5 \\* 2    #出现应该转义,否则认为是通配符10[root@baism ~]# expr 5 / 22[root@baism ~]# expr 5 % 21使用bc计算器处理浮点运算,scale=2代表小数点保留两位[root@baism ~]# echo \"scale=2;3+100\"|bc103[root@baism ~]# echo \"scale=2;100-3\"|bc97[root@baism ~]# echo \"scale=2;100/3\"|bc33.33[root@baism ~]# echo \"scale=2;100*3\"|bc300双小圆括号运算,在shell中(( ))也可以用来做数学运算[root@baism ~]# echo $(( 100+3))103[root@baism ~]# echo $(( 100-3))97[root@baism ~]# echo $(( 100%3))1[root@baism ~]# echo $(( 100*3))300[root@baism ~]# echo $(( 100/3))33[root@baism ~]# echo $(( 100**3))     #开方运算1000000

2.7 数学比较运算

符号 含义
-eq 等于
-gt 大于
-lt 小于
-ge 大于或等于
-le 小于或等于
-ne 不等于

2.8 字符串比较运算

符号 含义
== 等于
!= 不等于
-n 检查字符串的长度是否大于0
-z 检查字符串的长度是否为0

2.9 文件比较与检查

符号 含义
-d 检查文件是否存在且为目录
-e 检查文件是否存在
-f 检查文件是否存在且为文件
-r 检查文件是否存在且可读
-s 检查文件是否存在且不为空
-w 检查文件是否存在且可写
-x 检查文件是否存在且可执行
-O 检查文件是否存在并且被当前用户拥有
-G 检查文件是否存在并且默认组为当前用户组
file1 -nt file2 检查file1是否比file2新
file1 -ot file2 检查file1是否比file2旧

2.10 逻辑运算

符号 含义
&&
||

2.11 退出

exit NUM 退出脚本,释放系统资源,NUM代表一个整数,代表返回值。

三、 格式化输出

3.1 echo命令

功能: 将内容输出到默认显示设备(显示屏)
语法: echo [-ne][字符串]
补充说明: echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开,并在最后加上换行号。

命令选项 含义
-n 不要在最后自动换行
-e 若字符串中出现转义字符,则特别加以处理
转义字符 含义
\\a 发出警告声;
\\b 删除前一个字符;
\\c 最后不加上换行符号;
\\f 换行但光标仍旧停留在原来的位置;
\\n 换行且光标移至行首;
\\r 光标移至行首,但不换行;
\\t 插入tab;
\\v 与\\f相同;
\\ 插入\\字符;
\\nnn 插入nnn(八进制)所代表的ASCII字符;
–help 显示帮助–version显示版本信息

3.2 颜色

脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e
格式如下:

echo -e \"\\033[字背景颜色;文字颜色m字符串\\033[0m\"

字颜色:30—–37echo -e “\\033[30m 黑色字 \\033[0m”echo -e “\\033[31m 红色字 \\033[0m”echo -e “\\033[32m 绿色字 \\033[0m”echo -e “\\033[33m 黄色字 \\033[0m” echo -e “\\033[34m 蓝色字 \\033[0m” echo -e “\\033[35m 紫色字 \\033[0m” echo -e “\\033[36m 天蓝字 \\033[0m” echo -e “\\033[37m 白色字 \\033[0m” 字背景颜色范围:40—–47echo -e “\\033[40;37m 黑底白字 \\033[0m”echo -e “\\033[41;37m 红底白字 \\033[0m”echo -e “\\033[42;37m 绿底白字 \\033[0m”echo -e “\\033[43;37m 黄底白字 \\033[0m”echo -e “\\033[44;37m 蓝底白字 \\033[0m”echo -e “\\033[45;37m 紫底白字 \\033[0m”echo -e “\\033[46;37m 天蓝底白字 \\033[0m”echo -e “\\033[47;30m 白底黑字 \\033[0m”最后面控制选项说明\\033[0m 关闭所有属性\\033[1m 设置高亮度\\033[4m 下划线\\033[5m 闪烁\\033[7m 反显\\033[8m 消隐设置前景色\\033[40m — \\33[47m 设置背景色\\033[nA 光标上移n行\\033[nB 光标下移n行\\033[nC 光标右移n行\\033[nD 光标左移n行\\033[y;xH设置光标位置\\033[2J 清屏\\033[K 清除从光标到行尾的内容\\33[s 保存光标位置\\033[u 恢复光标位置\\033[?25l 隐藏光标\\033[?25h 显示光标

四、 输入

read命令
默认接受键盘的输入,回车符代表输入结束

命令选项 含义
-p 打印信息
-t 限定时间
-s 不回显
-n 输入字符个数

五、 变量

5.1 分类

本地变量: 用户私有变量,只有本用户可以使用,保存在家目录下的

.bash_profile

.bashrc

文件中
全局变量: 所有用户都可以使用,保存在

/etc/profile

/etc/bashrc

文件中
用户自定义变量: 用户自定义,比如脚本中的变量

5.2 定义

5.2.1 自定义变量
变量名=值

在shell编程中的变量名和等号之间不能有空格。

命名规则:命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。中间不能有空格,可以使用下划线(_)。不能使用标点符号。不能使用bash里的关键字(可用help命令查看保留关键字)。字符串要用单引号或双引号引起来
5.2.2 全局变量

export

这种定义方式是一次性变量,系统重启就会丢失。如果本地变量或者全局变量需要永久使用,将变量写入变量文件中。
5.2.3 永久变量

见5.1中提到的文件,写入相应的文件。

5.3 读取

读取变量内容符:

$

读取方法:$变量名

5.4 取消

unset

六、 数组

6.1 定义

数组名称=(元素1 元素2 元素3 ...)

6.2 读出

${数组名称[索引]}索引默认是元素在数组中的排队编号,默认第一个从0开始

6.3 赋值

一次赋一个值:

array0[0]=\'tom\'array0[1]=\'jarry\'array0[2]=\'natasha\'

一次赋多个值:

array2=(tom jack alice)array3=(`cat /etc/passwd`) 希望是将该文件中的每一个行作为一个元素赋值给数组array3array4=(`ls /var/ftp/Shell/for*`)array5=(tom jack alice \"bash shell\")

6.4 查看

declare -a

6.5 访问

echo ${array1[0]} 访问数组中的第一个元素echo ${array1[@]} 访问数组中所有元素 等同于 echo ${array1[*]}echo ${#array1[@]} 统计数组元素的个数echo ${!array2[@]} 获取数组元素的索引echo ${array1[@]:1} 从数组下标1开始echo ${array1[@]:1:2} 从数组下标1开始,访问两个元素

6.6 关联数组

关联数组可以允许用户自定义数组的索引,方便、高效。

6.6.1 定义

申明关联数组变量

declare -A ass_array1declare -A ass_array2
6.6.2 赋值

一次赋一个值:

数组名[索引]=变量值

ass_array1[index1]=pearass_array1[index2]=appleass_array1[index3]=orangeass_array1[index4]=peach

一次赋多个值:

ass_array2=([index1]=tom [index2]=jack [index3]=alice [index4]=\'bash shell\')

七、 判断

7.1 if语法

单if语句

if [ condition ]           #condition 值为true or falsethencommandsfi

if-then-else语句

if [ condition ]thencommands1elsecommands2fi

if-then-elif语句

if [ condition 1]thencommands1elif [ condition 2]thencommands2.......elsecommandsXfi

7.2 if的高级应用

  1. 条件符号使用双圆括号,可以在条件中植入数学表达式
    注意 双小圆括号中的比较运算符 使用的是我们传统的比较运算符 >>= == <<= !=
  2. 使用双方括号,可以在条件中使用通配符

7.3 case语法

case 变量  in条件1)执行代码块1;;条件2)执行代码块2;;......esac

注意: 每个代码块执行完毕要以

;;

结尾代表结束,case结尾要以倒过来写的

esac

来结束。

八、 循环

8.1 for 语法

for var in value1 value2 ......docommandsdone
for ((变量;条件;自增减运算  ))do代码块done

8.2 while 语法

while  [ condition ]      #条件为真while循环,条件为假停止循环docommandsdone

8.3 until 语法

until [ condition ]      #条件为假until循环,条件为真停止循环docommands代码块done

8.4 循环控制

命令 含义
sleep N 脚本执行到该步休眠N秒
continue 跳过循环中的某次循环
break 跳出循环继续执行后续代码
break N 跳出某个循环,从内循环到外循环依次编号为1-N

九、 函数

函数名 () {代码块return N}
function 函数名 {代码块return N}

十、 正则表达式

10.1 介绍

正则表达式是一种文本模式匹配,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为\”元字符\”)。它是一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串、将匹配的子串替换或者从某个字符串中取出某个条件的子串。

正则表达式就像数学公式一样,我们可以通过正则表达式提供的一些特殊字符来生成一个匹配对应字符串的公式,用此来从海量数据中匹配出自己想要的数据。

正则表达式是一个三方产品,被常用计算机语言广泛使用,比如:shell、PHP、python、java、js等。

shell也支持正则表达式,但不是所有的命令都支持正则表达式,常见的的命令中只有grep、sed、awk命令支持正则表达式。

10.2 特殊字符

定位符
使用方式:

  1. 同时锚定开头和结尾,做精确匹配;
  2. 单一锚定开头和结尾,做模糊匹配。
定位符 说明
^ 锚定开头 ^a 以a开头 默认锚定一个字符
$ 锚定结尾 a$ 以a结尾 默认锚定一个字符

匹配符
使用方式:匹配字符串

匹配符 说明
. 匹配除回车以外的任意字符
( ) 字符串分组
[ ] 定义字符类,匹配括号中的一个字符
[ ^ ] 表示否定括号中出现字符类中的字符,取反。
\\ 转义字符
|

限定符
使用方式:对前面的字符或者字符串做限定说明

限定符 说明
* 某个字符之后加星号表示该字符不出现或出现多次
与星号相似,但略有变化,表示该字符出现一次或不出现
+ 与星号相似,表示其前面字符出现一次或多次,但必须出现一次
{n,m} 某个字符之后出现,表示该字符最少n次,最多m次
{m} 正好出现了m次

10.3 POSIX特殊字符

特殊字符 说明
[:alnum:] 匹配任意字母字符0-9 a-z A-Z
[:alpha:] 匹配任意字母,大写或小写
[:digit:] 数字 0-9
[:graph:] 非空字符( 非空格控制字符)
[:lower:] 小写字符a-z
[:upper:] 大写字符A-Z
[:cntrl:] 控制字符
[:print:] 非空字符( 包括空格)
[:punct:] 标点符号
[:blank:] 空格和TAB字符
[:xdigit:] 16 进制数字
[:space:] 所有空白字符( 新行、空格、制表符)

注意:

[[ ]]

第一个中括号是匹配符[] ,匹配中括号中的任意一个字符,第二个[]是格式 如[:digit:]

十一、 对文件操作(sed命令)

11.1 简介

sed是linux中提供的一个外部命令,它是一个行(流)编辑器,非交互式的对文件内容进行增删改查的操作,使用者只能在命令行输入编辑命令、指定文件名,然后在屏幕上查看输出。

与文本编辑器的区别: 文本编辑器:的编辑对象是文件、行编辑器的编辑对象是文件中的行

原理:

11.2 语法

sed [options] \'{command}[flags]\' [filename]
命令选项 说明
-e script 将脚本中指定的命令添加到处理输入时执行的命令中 多条件,一行中要有多个操作
-f script 将文件中指定的命令添加到处理输入时执行的命令中
-n 抑制自动输出
-i 编辑文件内容
-i.bak 修改时同时创建.bak备份文件。
-r 使用扩展的正则表达式
! 取反 (跟在模式条件后与shell有所区别)
命令 说明
a 在匹配后面添加
i 在匹配前面添加
p 打印
d 删除
s 查找替换
c 更改
y 转换 N D P
标志位 说明
数字 表示新文本替换的模式
g 表示用新文本替换现有文本的全部实例
p 表示打印原始的内容
w filename: 将替换的结果写入文件

十二、 对输出流的处理(awk)

在日常计算机管理中,总会有很多数据输出到屏幕或者文件,这些输出包含了标准输出、标准错误输出。默认情况下,这些信息全部输出到默认输出设备—屏幕。然而,大量的数据输出中,只有一小部分是我们需要重点关注的,我们需要把我们需要的或者关注的这些信息过滤或者提取以备后续需要时调用。

awk

命令能够集过滤、提取、运算为一体,平行命令还有

gawk

pgawk

dgawk

12.1 简介

awk是一种可以处理数据、产生格式化报表的语言。awk 认为文件中的每一行是一条记录 记录与记录的分隔符为换行符,每一列是一个字段 字段与字段的分隔符默认是一个或多个空格或tab制表符。

awk的工作方式是读取数据,将每一行数据视为一条记录(record)每条记录以字段分隔符分成若干字段,然后输出各个字段的值。

12.2 语法

awk [options] [BEGIN]{program} [END][file]
命令选项 说明
-F fs 指定描绘一行中数据字段的文件分隔符 默认为空格
-f file 指定读取程序的文件名
-v var=value 定义awk程序中使用的变量和默认值

注意: awk 程序脚本由左大括号和右大括号定义。脚本命令必须放置在两个大括号之间。由于awk命令行假定脚本是单文本字符串,所以必须将脚本包括在单引号内。

优先级:
1)BEGIN: 在开始处理数据流之前执行,可选项
2)program: 如何处理数据流,必选项
3)END: 处理完数据流后执行,可选项

12.2.1 对字段(列)的提取
内置变量 说明
$0 表示整行文本
$1 表示文本行中的第一个数据字段
$2 表示文本行中的第二个数据字段
$N 表示文本行中的第N个数据字段
$NF 表示文本行中的最后一个数据字段
12.2.2 对记录(行)的提取

NR: 指定行号

12.3 高级用法

环境变量 描述
FIELDWIDTHS 以空格分隔的数字列表,用空格定义每个数据字段的精确宽度
FS 输入字段分隔符号
OFS 输出字段分隔符号
RS 输入记录分隔符
ORS 输出记录分隔符号
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 学习笔记 — shell脚本