SHELL脚本 - Charles-Charmless/Charles-Charmless.github.io GitHub Wiki

变量

variable=`command`
variable=$(command)

Linux-shell图形桌面脚本编程

Share

文本菜单

  1. 创建菜单布局:
    • 通过echo给予特定的参数来输出制表符之类的格式控制字符,来控制菜单布局的美观
  2. 创建菜单函数:
    • 针对每一个菜单创建独立的shell函数,然后,把他们当做独立函数在代码中分布开来 通常会为还没有实现的函数创建一个桩函数(没有任何命令的函数,或者只用echo语句来说明最终那里需要什么函数) 也可以将菜单显示函数当做一个独立函数,这样就可以多次显示菜单。
  3. 添加菜单逻辑:
    • 通过case命令根据用户输入的字符选择来调用合适的函数,通常用默认的case命令字符(*)来捕获所有不正确的菜单项
  4. 整个shell脚本菜单:
  5. 使用select命令: select命令允许从单个命令行创建菜单,然后提取输入的答案并自动处理 +————————————–+————————————–+ | 1234 | select variable in list do | | | commands done | +————————————–+————————————–+
  • list参数是构成菜单的空格分割的文本选项列表 + select 命令会在列表中将每一个选项作为一个编好号的选项显示,然后为选项创建一个特殊的PS3环境变量定义的提示符

窗口菜单

  1. dialog包(该包能在文本环境中用ANSI转义控制字符来创建标准的窗口对话框)(通过 sudo yum install dialog安装) 部件类型 描述 例子 ———— ———————————————- —————————————————————— calender 提供选择日期的日历
    checklist 显示多个选项
    from 构建一个表单
    fselect 提供一个文件选择窗口来浏览选择文件 dialog –title “hint” –fselect file heigth width 重定向 gauge 显示完成的百分比进度条
    infobox 显示一条信息,但不用等待回应
    inputbox 提供一个输入文本用的文本表单 dialog –inputbox “xxx” heigth width 重定向 inputmenu 提供一个可编辑的菜单
    menu 显示可选择的一系列选项 dialog –menu “title” height width N(一次显示的菜单项总数) “menu” msgbox 显示一条信息,并要去用户选择ok按钮 dialog –msgbox text height width pause 显示一个进度条来显示特定暂定时间的状态
    passwdbox 显示一个文本框来输入文本,但会隐藏输入的文本
    passwdform 显示一个带标签和隐藏文本输入的表单
    radiolist 提供一个菜单选项,但只能选择其中的一项
    tailbox 用tail命令在滚动窗口中显示文件的内容
    tailboxbg 和tailbox一样,但是在后台运行
    textbox 在滚动窗口中显示文件内容 dialog –textbox file height width timebox 提供一个选择小时,分,秒的窗口
    yesno 提供一个简单的带yes和no按钮的消息 dialog –title “xxx” –yesno “xxx” heigth width

指定特定部件
要在命令行指定某个特定的部件,需要使用双破折线格式(–)
dialog --widget parameter 

  • widget是部件名
  • parameter定义了部件窗口的大小以及部件所需要的文本
  1. dialog选项 (有时间再补充吧,可以查看帮助手册)(未完)
  2. 在脚本中使用dialog命令

★注意事项
如果有cancel和no选项,检查dialog命令的退出状态码

  • 如果选择了YES或OK按钮,退出状态码为1
  • 如果选择了Cancel或No按钮,dialog命令退出状态码为1

重定向STDERR来获取输出值


图形菜单:使用扩展的dialog命令 {#图形菜单:使用扩展的dialog命令}

KDE环境(kdialog) {#KDE环境(kdialog)}

kdialog部件 描述
–checklist title tag item status 多选列表菜单,状态会说明该选项是否被选定
–error text 错误信息框
–input text tag item 输入文本框,可以用init值来指定默认值
–menu titletag item 带有标题的菜单选择框,以及用tag标识的选型列表
–msgbox text 显示指定文本的简单消息框
–passwdbox text 隐藏用户输入的密码输入文本框
–radiolist titletag item status 单选列表菜单,状态会说明该选项是否被选定
–separate-output 为多选列表和单选列表菜单返回按列分开的选项
–sorry text “sorry”对话框
–textbox filewidth height 显示file的内容的文本框,另外指定了width和heigth
–title title 为对话窗口的titlebar区域指定一个标题
–warningyesno text 带有yes和no的警告消息框
–warningcontinuecancel text 带有yes和no的警告消息框
–warningyesnocancel text 带有yes和no和cancel的警告消息框
–yesno text 带有yes和no的提问框
–yesnocancel text 带有yes和no和cancel的提问框

GNOME环境(zenity)

zenity部件 描述
–calender 显示整月日历
–entry 显示文本输入对话窗口
–error 显示错误信息对话框
–file-selection 显示完整的文件名和文件名称对话窗口
–info 显示信息对话窗口
–list 显示多选列表或单选列表对话窗口
–notification 显示通知图标
–progress 显示进度条对话窗口
–question 显示yes/no对话框
–scale 显示可调整大小的窗口
–text-info 显示含有文本的文本框
–warning 显示警告对话信息
sed命令

sed 基础

sed编辑器(stream editor) 区别于交互式文本编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流

sed编辑器按照行来处理数据 sed编辑器自身不不会修改文本文件的数据,只会将修改后的数据发送到STDOUT。


sed命令的格式

sed options script file

script参数指定了将作用在数据流上的单个命令,如果需要多个命令,必须使用-e选型来在命令行上指定他们,或者-f选项在单独的文件中指定(命令之间只能用分号;来隔开,并且在命令末尾和分号之间不能有空格),要在封尾单引号所在行结束命令

sed 命令选项

选项 解析
-e script 在处理输入时,将script中的指定的命令添加到运行的命令行中
-f file 在处理输入时,将file中指定的命令添加到运行的命令中(从文件中读取编辑器命令)
-n 不要为每个命令生成输出,等待print命令来输出
___
功能

替换(substitute): s/pattern/replacement/flags 可用的flags:

  1. 数字(表示新文本将替换第几处模式匹配的地方)
  2. g(新文本将会替换所有已有文本出现的地方)
  3. p(将原来行的内容打印出来)
  4. w file(将替换的结果写到文件中)
  5. -n 该选项禁止原来文本的输出
  • 如果在要替换的文本中出现正斜线,需要做转义处理
  • gawk也可以用其他字符来作为substitute命令的字符串分隔符,例如s!pattern!replacement!flags

地址 
sed有两种形式的行选址

  • 行的数字范围
    数字范围过滤格式 [address]command ([]不存在,只做标识作用)

    或者  address{commands}
    

    sed编辑器会将指定的每条命令只作用到匹配指定地址的行上

    行的类型:

    • 单个行号
    • 用起始行号,逗号
    • 以及结尾行号来指定的一定范围内的行
  • 用文本形式来过滤出某行 
    文本范围过滤格式: /pattern/command 通过正则表达式的匹配来过滤范围

删除(delete)行
命令:
d

  • 会删除匹配指定寻址模式的所有行,如果忘记寻址模式会删除所有的行
  • 也可以删除两个文本模式之间的行,第一个模式用于打开删除模式,另一个模式用来关闭删除模式, 例:sed ‘/1/,/3/d’ file 删除文件的1-3行

插入(insert)和附加(append)文本
命令: 
i(insert) 和 a(append) 
格式:sed ‘[address]command new line’ new line行会出现在sed编辑器输出中指定的位置(不能使用地址区间)

修改(change)行 会用新的行来取代地址范围内的行

转换(translate)命令
命令:
y 
格式: 
[address]y/inchars/outchars  inchar和outchar长度必须相同,会用outchar中的字符来替代inchar中的字符

回顾打印 

  1. 小写p命令用来打印文本行
  2. 等号(=)命令用来打印行号
  3. l命令用来列出行

文件操作 
格式: 
[address]w filename(写操作) [address]r filename(读操作)

sed进阶

多行命令

sed编辑器的特殊命令

  1. N:将数据流的下一行加进来创建一个多行组来处理
  2. D:删除多行组的一行
  3. P:打印多行组的一行 命令 详细描述 ——————- ————————————————————————————————————————– 单行next命令(n) 会在匹配到模式之后将该行文本的下一行替换到编辑区间 多行next命令(N) 会在匹配模式之后将该行文本的下一行添加到编辑区(将两行连续的文本当作一行来处理) 多行删除命令D 他只删除模式空间的第一行直到换行符为止。 单行删除命令d配合多行next命令会删除多行 D命令会强制sed编辑器回到脚本的起始处 多行输出命令P 同样只打印多行模式空间的第一行,包括模式空间中直到换行符的所有字符。

保持空间

  1. 区别模式空间与保持空间
  2. 保持空间命令 命令 描述 —— ————————– h 将模式空间复制到保持空间 H 将模式空间附加到保持空间 g 将保持空间复制到模式空间 G 将保持空间附加到模式空间 x

排除命令

  • 感叹号(!)用于排除命令

改变流

通常sed编辑器会从脚本的顶端开始执行命令并一直处理到脚本的结尾

调转(branch)指令格式 : [address]b [label]  address参数决定了哪行或哪些行的数据会触发调转命令 label参数定义了要跳转的位置,如果没有label参数,跳转指令会跳转到脚本的结尾(在脚本内跳转)测试命令_描述*: 类似跳转命令,test命令t也用来改变sed编辑脚本的流,测试命令基于替换命令,的输出跳转到另一个标签,而不是基于地址跳转到一个标签
*格式
_[address]t [label] 如果替换命令成功匹配并替换了一个模式,测试命令就会跳转到指定的标签

模式替代

and符号 and符号(&)用来代表替换命令中的匹配模式,不管匹配模式是什么,都能用and符号在替代模式中调用他替换单独的单词 sed编辑器用圆括号来定义替换模式的子字符串,然后用替代模式中的特殊字符来引用每个子字符串。

  • 替代字符由反斜线和数字组成,数字表明子字符串模块的位置,sed编辑器给第一个模块分配字符\1,第二个子字符\2

  • 当在替换命令中使用圆括号时,必须使用转义字符来将他们识别为聚合字符而不是普通字符

    在脚本中使用sed

  • 使用包装脚本

  • 重定向sed的输出

创建sed实用程序(练习) {#创建sed实用程序(练习)}

  • 加倍行距
  • 对可能包含空白行的文本加倍行距
  • 给文件中的行编号
  • 打印末尾行
  • 删除连续的空白行
  • 删除来头的空白行
  • 删除html标签

gawk命令

Share

gawk基础

gawk提供一个类编程环境,允许修改和重新组织文件中的数据
gawk编程语言的功能:

  • 定义变量来保存数据
  • 使用算术和字符串操作符来处理数据
  • 使用结构化编程概念,比如if-then语句和for循环,来为数据处理添加逻辑
  • 提取数据文件中的数据元素并把他们按另一种顺序或格式重新放置,从而生成格式化报告

gawk以行位单位对数据进行处理

gawk程序的基本格式:gawk options program file

gawk选项 解析
-F fs  指定行中分隔数据字段的字段分隔符(默认的字段分隔符是任意空白符)
-f file  指定读取程序的文件名
-v var==value  定义gawk程序中一个变量及其默认值
-mf N  指定要处理的数据文件中的最大字段数
-mr n  指定数据文件中的最大数据行数
-W keyword  指定gawk的兼容模式或警告等级
  • gawk程序脚本用一对花括号来定义,必须要把脚本命令放到两个括号之间,并且gawk指定脚本位单个文本字符串,所以需要把脚本放到单引号中
  • ctrl+d产生EOF字符,该字符终止gawk命令,并返回命令行界面提示符

gawk变量与字段的匹配:

变量 解析
$0 $0代表整个文本
$1 $1代表文本行中的第1个数据字段
$2 $2代表文本行中的第2个数据字段
$3 $N代表文本行中的第N个数据字段
  • gawk编程语言允许将多条命令组合成一个正常的程序,只需要在每条命令之间方放一个分号即可
  • gawk编辑器允许将程序存储到文件中,然后在命令行中调用
  • gawk程序中可以指定多条命令,不需要用分号隔开,只用将每条命令放到一个新行即可
关键字 解析
BEGIN 强制gawk在读取数据前执行BEGIN关键字后指定的程序脚本
Wiki/Arm linux修炼之路/SHELL脚本/gawk命令/Untitled Database/END 指定gawk在读完数据之后执行关键字之后的的脚本

gawk进阶

使用变量

内建变量: {#内建变量:}

内建变量 解析
FIELDWIDTHS 由空格分隔开的定义了每个数据字段确切宽度的一列数字
FS 输入字段分隔符
RS 输入数据行分隔符
OFS 输出字段分隔符
ORS 输出数据行分隔符
ARGC 当前命令行参数个数
ARGIND 当前文件在ARGV的位置
ARGV 当汉命令行参数的数组
CONVFMT 数字转换格式,
ENVIRON 当前shell变量及其值组成的关联数组
ERRNO 当读取或关闭输入文件发生错误时的系统错误号
FILENAME 由做gawk输入数据的数据文件的文件名
FNR 当前数据文件的数据行数
IGNOORECASE 设置为非0时,忽略gawk命令中出现的字符串的大小写
NF 数据文件中的字段总数
NR 已处理的输入数据行数目
OFMT 数字的输出模式
RLENGTH 由match函数所匹配的子字符串的长度
RSTART 由match函数所匹配的子字符串的起始位置

自定义变量

可以i为文本和数值型,也可以做数值计算,变量既可以在脚本中被赋值也可以在命令行中被赋值

处理数组

  1. 定义数组变量: var[index] = element

    • var是变量名
    • index是关联数组的索引值
    • element是数据元素值
    • 在引用数组变量时,必须包含索引值来提取相应的元素值
  2. 遍历数组变量

    Column 1 Column 2
    1234 for (var in array)         { statements}

这个for语句会在每次将关联数组array的下一个索引值变量var 注意这个变量是索引值而不是数组元素值 索引值不会按照任何特定的顺序返回

  1. 删除数组元素 delete array[index] 
    • 删除命令会从数组中删除关联索引值和相关的数据元素值

使用模式

1.正则表达式:BRE+ERE(基本加扩展),使用正则表达式时,正则表达式必须出现在它要控制的程序脚本的左花括号前面

  1. 匹配操作符:允许将正则表达式限定在数据行中的特定数据字段,匹配操作符式~
  2. 数学表达式:可以在匹配模式中使用数学表达式

使用结构化命令

if语句: {#if语句:}

Column 1 Column 2
123 if (condition) { statement1}

if (condition) statement1if (condition) {statement1};else {statement2}

while语句: {#while语句:}

Column 1 Column 2
1234 while(condition){ statements}
  • 支持break和continue语句

    do-while语句: {#do-while语句:}

    Column 1 Column 2
    1234 do{statements}while(condition)

for语句: {#for语句:}

Column 1 Column 2
1234 for(variable assignment;conditio n;iteration process){ statements}

格式化打印

printf "format string",var1,var2(类似C语言)

格式化指定字符格式:  %[modifier]control-letter

  • control-letter指明显示什么类型数据值的单字符码,而modifier定义了另一个可选的格式化特性
控制字母 描述
Wiki/Arm linux修炼之路/SHELL脚本/gawk命令/Untitled Database/c c
Wiki/Arm linux修炼之路/SHELL脚本/gawk命令/Untitled Database/d d
Wiki/Arm linux修炼之路/SHELL脚本/gawk命令/Untitled Database/i i
Wiki/Arm linux修炼之路/SHELL脚本/gawk命令/Untitled Database/e e
f 显示一个浮点数
Wiki/Arm linux修炼之路/SHELL脚本/gawk命令/Untitled Database/g g
Wiki/Arm linux修炼之路/SHELL脚本/gawk命令/Untitled Database/o o
Wiki/Arm linux修炼之路/SHELL脚本/gawk命令/Untitled Database/s s
Wiki/Arm linux修炼之路/SHELL脚本/gawk命令/Untitled Database/X x
Wiki/Arm linux修炼之路/SHELL脚本/gawk命令/Untitled Database/X 显示一个十六进制数,单用大写字母A-Z
另外三种修饰符 作用
width 指定输出字段的最小宽度的数字值,如果输出短于这个值,printf会右对齐,如果输出字段过长,会覆盖width值
prec 指定了符点数中小数点后面位数的数字值,或者用文本字符串中显示的最大字符数
  • 指明在向格式化写入空间放入数据时会采用左对齐而不是右对齐的方式

操作函数

内建函数

数学描述

数学函数 描述
atan2(x,y) x/y的反正弦,弧度制
cos(x) x的余弦值
exp(x) x的值数函数
int(x) x的整数部分,取靠近0的一侧
log(x) x的自然对数
rand(x) 0-1之间的随机数
sin(x) x的正弦值
sqrt(x) x的平方根
srand(s) 为计算随机数指定一个种子值

字符串函数

字符串函数 描述
asort(s,d) 2 将数组s按照数据元素值排序,索引值会被替换成表示新的排序的连续数字,另外,如果指定了d,则排序后的数组会被存储在数组d中
asort(s,d) 如果将数组s按照索引值排序,生成的数组会按照索引值生成数据元素值,用连续的数字索引来表示排序顺序,另外,如果指定了d,排序后的数组会存储在d中
gensub(r,s,h,t) 查找变量$0或目标字符串t来匹配正则表达时r,如果h也是一个以g或者G开头的字符串,就用s替换到匹配的文本,如果h是一个数字,他表示要替换掉第几个r匹配的地方
gsub(r,s,t) 查找变量$0或目标字符串t来匹配正则表达式r,如果找到了,就全部替换成字符串s
index(s,t) 返回字符串t在字符串s中的索引值,如果没有,则返回0
length(s) 返回字符串s的长度,如果没有指定的话,返回$0的长度
match(s,r,a) 返回字符串s中正则表达式r出现的位置的索引,如果指定了数组a,他会存储在s中匹配正则表达式的那部分
split(s,a,r) 将s用FS字符或正则表达式分开放到数组a中,返回字段的总数
sprintf(format,variables) 用提供的format和variable返回一个类似于printf式出的字符
sub(r,s,t) 在变量$0或目标字符t中查找正则表达式r的匹配,如果找到了,就用字符串s替换到第一处匹配
substr(s,i,n) 返回s中从索引值i开始的n个字符组成的子字符串,如果未提供p,则返回s剩下部分
tolower(s) 将s中的所有字符转换成小写
toupper(s) 将s中的所有字符转换成大写
时间函数 2
时间函数 时间戳(自1970-01-01 00:00:00到现在,以秒为单位,通常称为epoch time)
Wiki/Arm linux修炼之路/SHELL脚本/gawk命令/Untitled Database/-- --
mktime(datespec) 将一个按照YYYY MM DDMHH MM SS [DST]格式指定的日期转换为时间戳
strftime(format,timestamp) 将当前时间的时间戳或timestamp转化为用shell函数格式date()的格式化时间
systime() 返回当前时间的时间戳

自定义函数

定义函数:

function name([variables]){ statements }

  • 可以有return函数
  1. 使用自定义函数: 定义函数时必须出现在其他所有代码之前,包括BEGIN代码块
  2. 创建函数库: 将所有的函数写在同一个文件内(函数库) 通过gawk -f参数调用即可 (同时指定库文件和程序文件)

正则表达式

正则表达式

  • 正则表达式是linux工具用来过滤文本的模式模板
  • 正则表达利用通配符来代表数据流中的一个或多个字符 常用于sed gawk grep等程序中
  • 正则表达式分为基本正则表达式(BRE)和扩展正则表达式(ERE) sed只支持BRE,gawk支持ERE

BRE模式

  • 正则表达式区分大小写
  • 正则表达式不用写出完整的单词,自动匹配剩余部分
  • 可以在正则表达式中使用空格和数字
  • 如果在正则表达式中定义了空格,那么就必须出现在数据流中,甚至可以匹配多个空格

特殊字符(组)

正则表达式识别的特殊字符包括 .*[]^${}0++?|() (不能在文本模式中单独使用这些字符,需要做转义\处理) 尽管/不是正则表达式的特殊字符,但是在正则表达式也要做转义处理

特殊字符 描述
^(脱字符) 定义从数据流中由换行符决定的新文本行的行首开始的模式。  要使用脱字符,必须将他放在正则表达式中指定的模式前面  如果将脱字符列在正则表达式的模式的最后,编辑器会将他当作普通字符匹配。
$(美元符) 定义了行尾锚点,这个字符加在文本模式之后来指明数据行必须以该模式结尾
组合锚点 行首锚点和行尾锚点一起使用(可以删除空白行)
(点字符) 点字符用来匹配除换行符之外任意的单字符(必须匹配一个字符,不能没有)
Wiki/Arm linux修炼之路/SHELL脚本/正则表达式/Untitled Database/ 3 3
(字符组) 字符组中的某个字符出现子数据流中,那他就匹配了该模式,方括号中应该含有你要在该组中包含的任何字符,一个字符组只能匹配一个字符,不能匹配多个字符
Wiki/Arm linux修炼之路/SHELL脚本/正则表达式/Untitled Database/^ ^
Wiki/Arm linux修炼之路/SHELL脚本/正则表达式/Untitled Database/- -
特殊字符组 描述
-alpha-p 匹配任意字母字符,不管式大写还是小写
-alnum- 匹配任意字母数字字符0-9,A-Z,a-a
-blank- 匹配空白符或指标符
-digit- 匹配0-9之间的数字
-lower- 匹配小写字母a-z
-print- 匹配任意可打印字符
-punct- 匹配任意标点符号
-space- 匹配任意空百符:空格,制表符,NL,FF,VT,CR
-upper- 匹配任意大写字母A-Z

ERE模式(扩展正则表达式) {#ERE模式(扩展正则表达式)}

特殊字符 描述
Wiki/Arm linux修炼之路/SHELL脚本/正则表达式/Untitled Database/ 2 2
Wiki/Arm linux修炼之路/SHELL脚本/正则表达式/Untitled Database/+ +表示前面的字符可以出现1次或多次,但至少出现1次
{} 为重复的正则表达式指定一个上限
{n} 正则表达式正好出现n次
{m,n} 正则表达式至少出现m次,至多n次
Arm linux修炼之路/SHELL脚本/正则表达式/Untitled Database/| 管道符号允许在检查数据流时,用逻辑或的方式指定正则表达式引擎要用的两个或多个模式,如果其中一个模式匹配了数据流文本,文本就通过了,如果没有模式匹配,数据流文本匹配就不成立
() 把正则表达式的模式用()聚合起来就可以把()内部的正则表达式模式当成标准字符(单个)。

getops 解析命令行参数的 shell 内置命令

⚠️ **GitHub.com Fallback** ⚠️