shell开发快速入门
文章目录
- shell开发快速入门
- 初识bash
- 什么是shell
- bash shell的主要功能
- shell的变量
- 变量的设置与显示
- 变量的规则
- 变量的作用域
- 变量的类型
- 变量内容的变更
- bash的环境配置文件
- login shell的配置文件读取流程
- bash的通配符
- bash的特殊字符
- 数据流重定向
- 双向重定向
- 命令分类
- 管道命令
- 参数代换:xargs
- 选取命令
- 排序命令
- 字符转换命令
- 分割命令
- 数据处理命令
- shell中的正则
- 特殊字符
- 基础正则表达式
- 扩展正则表达式
- shell 脚本
- 脚本format
- 表达式判断
- 脚本的默认变量
- 条件判断语句
- if else语句
- case语句
- 循环语句
- while循环
- until循环
- for循环
- function化
- 脚本的追踪调试
初识bash
什么是shell
可以操作应用程序的接口都可以称为shell,但是狭义上也指命令行方面的软件。shell的功能只是提供用户操作系统的一个接口,因此这个shell需要可以调用其他软件。
bash 命令行界面的shell
目前bash是Linux的默认shell。
除了bash shell还有其他shell,系统支持的shell都会写到/etc/shell文件中。
用户的默认shell写在 /etc/passwd文件中。
bash shell的主要功能
-
历史命令
本次登录的历史命令,存储在内存之中,通过上下键查询。本次登录之前的任务,存储在
~/.bash_history文件中。 -
命令补齐
在字母之后尝试按【Tab】键,会进行命令的提示和补全。或者文件的提示和补全。
-
命令别名设置
为常用命令设置别名,可以简化输入。执行
alias lm='ls -a'后,输入lm命令效果等同于ls -a。默认本次shell有效。取消别名unalias lm。 -
作业控制
job的前台 后台控制。后台任务可以不用担心【Ctrl】+C中断进程。
-
程序脚本
可以实现程序化的执行命令。bash script文件以.sh文件后缀名结尾。
shell的变量
变量的设置与显示
echo命令显示变量值
echo $变量名
unset取消变量
unset $变量名
变量的规则
- 变量名与变量值通过
=连接 =之间不能有空格符- 变量名由数字和英文组成,开头字符不能为数字
- 变量值中若含有空格符,需要通过双引号或者单引号连接
- 双引号中的特殊字符,保留特殊字符的原本特性,如$
- 单引号中的特殊字符,会变成一般字符(纯文本)
- 可以使用转义字符,将特殊字符变成一般字符
- 在一串命令中可以使用反单引号"`命令`“,或者”$(命令)"来优先执行,并将执行结果通过给其他命令。
- 若需要将变量的作用域扩大,使用export将变量变为环境变量。
- 大写变量为系统默认变量,自定义的变量请勿使用全大写。
- 可以使用unset来取消变量,是变量失效。
系统的默认变量可以使用env命令,查询出来。$和?是两个特殊变量。$代表当前shell的线程号,使用命令echo $$可以输出。?代表上一个命令的回传值,表明命令是否成功执行。0代表成功执行,其他值均代表错误。可以通过ehco $?命令输出结果。
变量的作用域
【shell局部变量】【shell环境变量】【用户系统变量】
当启动一个shell时,操作系统会分配一块内存给shell使用,此内存的变量(shell环境变量)可以让子线程取用。
当父进程创建一个变量,此时变量是shell局部变量,在进行export变量时,会将自定义的变量写到上述的shell的内存中,此时变量升级为shell环境变量
当从父shell中加载另一个shell的时候,子shell会将父shell环境的变量所在的存储导入到自己的存储中。若父shell退出,则变量失效。
若开辟了一个新的远程连接shell,将无法读取另一个远程shell中的shell环境变量。若想其他远程连接shell可以共享变量,可以讲变量写入用户的~/.bash_profile中,用户每次登录都会加载里面的数据。
变量的类型
变量的类型只有字符串类型(默认),整数类型,和数组类型,可以通过declare或者typeset来声明变量。
变量内容的变更
内容的删除,替换,截取
变量的长度:echo ${#变量}
| 变量设置方式 | 说 明 |
|---|---|
${变量#关键字} | 若变量内容从头开始的数据符合”关键字“,则将符合的最短数据删除 |
${变量##关键字} | 若变量内容从头开始的数据符合”关键字“,则将符合的最长数据删除 |
${变量%关键字} | 若变量内容从尾向前的数据符合”关键字“,则将符合的最短数据删除 |
${变量%%关键字} | 若变量内容从尾向前的数据符合”关键字“,则将符合的最长数据删除 |
${变量/旧字符串/新字符串} | 若变量内容符合”旧字符串“,则第一个旧字符串会被新字符串替换 |
${变量//旧字符串/新字符串} | 若变量内容符合”旧字符串“,则全部个旧字符串会被新字符串替换 |
${变量:number} | 从左往右 变量值的第number个字符截取到变量值的末尾 |
${变量:0-number}或者${变量: -number} | 从变量值的倒数第number个字符开始截取到变量值的末尾 |
${变量:number:length} | 从左往右 变量值的第number个字符开始,截取length个字符 |
${变量:0-number:length}或者${变量: -number:length} | 从变量值的倒数第number个字符开始,截取length个字符 |
${变量:0-number1:-number2} | 从变量值的倒数第number1个字符开始截取变量值到末尾,再之前截取的结果基础上,截取最后的number2个字符。从Centos 7支持。 |
变量的根据str变量觉得变量var
| 变量设置方式 | str没有设置 | str为空字符串 | str已设置非空字符串 |
|---|---|---|---|
| var=${str-expr} | var=expr | var= | var=$str |
| var=${str:-expr} | var=expr | var=expr | var=$str |
| var=${str+expr} | var= | var=expr | var=expr |
| var=${str:+expr} | var= | var= | var=expr |
| var=${str=expr} | str=expr var=expr | str=不变 var=expr | str=不变 var=$str |
| var=${str:=expr} | str=expr var=expr | str=expr var=expr | str=不变 var=$str |
| var=${str?expr} | expr输出值stderr | var= | var=str |
| var=${str:?expr} | expr输出值stderr | expr输出值stderr | var=str |
bash的环境配置文件
login shell 需要输入账号密码才能获取的bash
nolong shell 不需要输入账号密码才能获取的bash
login shell与non-login shell的加载配置文件是不一样的。
login shell的配置文件读取流程
所有用户(login shell)都会去读取/etc/profile文件,这是一个整体环境的配置文件,在完成/etc/profile的相关逻辑之后,会读取~/.bash_profile配置文件,这是一个用户的个人配置文件,在这个配置文件读取中会读取~/.bashrc文件的内容。这个配置文件~/.bashrc比较特殊,在non-login shell的时候也会去读取。常规情况下,一些用户的配置建议可以写到~/.bashrc这个文件中。
bash的通配符
| 符号 | 意义 |
|---|---|
| * | 代表0到无穷个任意字符 |
| ? | 代表一个任意字符 |
| [] | 同样代表一个有一个在中括号内的字符(非任意字符) |
| [-] | 若有减号在中括号内时,代表在编码顺序内的所有字符。例如[0-9]代表0-9之间的所有数字 |
| [^] | 若中括号内的第一个字符为指数符号^,那表示反向选择,例如[^abc],代表一定有一个字符,只要非a,b,c的其他字符。 |
bash的特殊字符
| 符号 | 意义 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| # | 批注符号,在脚本中作为注释。不执行 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| \ | 转义符号,将特殊符号或者通配符转成一般字符 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ; | 连续命令执行分隔符 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ~ | 用户的主文件夹 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| $ | 使用变量的前导符 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| & | 作业控制,将命令变成后台执行 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ! | 逻辑意义上的非(not) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| / | 目录符号 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| >,>> | 数据流重定向,输出方向,替换和追加 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
控制。
#mermaid-svg-iNK2hXxrvZO3GzBb {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-iNK2hXxrvZO3GzBb .error-icon{fill:#552222;}#mermaid-svg-iNK2hXxrvZO3GzBb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-iNK2hXxrvZO3GzBb .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-iNK2hXxrvZO3GzBb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-iNK2hXxrvZO3GzBb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-iNK2hXxrvZO3GzBb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-iNK2hXxrvZO3GzBb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-iNK2hXxrvZO3GzBb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-iNK2hXxrvZO3GzBb .marker.cross{stroke:#333333;}#mermaid-svg-iNK2hXxrvZO3GzBb svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-iNK2hXxrvZO3GzBb .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-iNK2hXxrvZO3GzBb .cluster-label text{fill:#333;}#mermaid-svg-iNK2hXxrvZO3GzBb .cluster-label span{color:#333;}#mermaid-svg-iNK2hXxrvZO3GzBb .label text,#mermaid-svg-iNK2hXxrvZO3GzBb span{fill:#333;color:#333;}#mermaid-svg-iNK2hXxrvZO3GzBb .node rect,#mermaid-svg-iNK2hXxrvZO3GzBb .node circle,#mermaid-svg-iNK2hXxrvZO3GzBb .node ellipse,#mermaid-svg-iNK2hXxrvZO3GzBb .node polygon,#mermaid-svg-iNK2hXxrvZO3GzBb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-iNK2hXxrvZO3GzBb .node .label{text-align:center;}#mermaid-svg-iNK2hXxrvZO3GzBb .node.clickable{cursor:pointer;}#mermaid-svg-iNK2hXxrvZO3GzBb .arrowheadPath{fill:#333333;}#mermaid-svg-iNK2hXxrvZO3GzBb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-iNK2hXxrvZO3GzBb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-iNK2hXxrvZO3GzBb .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-iNK2hXxrvZO3GzBb .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-iNK2hXxrvZO3GzBb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-iNK2hXxrvZO3GzBb .cluster text{fill:#333;}#mermaid-svg-iNK2hXxrvZO3GzBb .cluster span{color:#333;}#mermaid-svg-iNK2hXxrvZO3GzBb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-iNK2hXxrvZO3GzBb :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
标准输入
标准输出
标准错误输出
file
command
file
screen
如何简单的一次输入多重命令 借助
命令分类管道命令什么是管道命令,有什么功能,有什么使用注意点 管道命令
#mermaid-svg-bfz8y29kjzNp4JZq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bfz8y29kjzNp4JZq .error-icon{fill:#552222;}#mermaid-svg-bfz8y29kjzNp4JZq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bfz8y29kjzNp4JZq .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-bfz8y29kjzNp4JZq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bfz8y29kjzNp4JZq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bfz8y29kjzNp4JZq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bfz8y29kjzNp4JZq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bfz8y29kjzNp4JZq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bfz8y29kjzNp4JZq .marker.cross{stroke:#333333;}#mermaid-svg-bfz8y29kjzNp4JZq svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bfz8y29kjzNp4JZq .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-bfz8y29kjzNp4JZq .cluster-label text{fill:#333;}#mermaid-svg-bfz8y29kjzNp4JZq .cluster-label span{color:#333;}#mermaid-svg-bfz8y29kjzNp4JZq .label text,#mermaid-svg-bfz8y29kjzNp4JZq span{fill:#333;color:#333;}#mermaid-svg-bfz8y29kjzNp4JZq .node rect,#mermaid-svg-bfz8y29kjzNp4JZq .node circle,#mermaid-svg-bfz8y29kjzNp4JZq .node ellipse,#mermaid-svg-bfz8y29kjzNp4JZq .node polygon,#mermaid-svg-bfz8y29kjzNp4JZq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bfz8y29kjzNp4JZq .node .label{text-align:center;}#mermaid-svg-bfz8y29kjzNp4JZq .node.clickable{cursor:pointer;}#mermaid-svg-bfz8y29kjzNp4JZq .arrowheadPath{fill:#333333;}#mermaid-svg-bfz8y29kjzNp4JZq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bfz8y29kjzNp4JZq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bfz8y29kjzNp4JZq .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-bfz8y29kjzNp4JZq .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-bfz8y29kjzNp4JZq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bfz8y29kjzNp4JZq .cluster text{fill:#333;}#mermaid-svg-bfz8y29kjzNp4JZq .cluster span{color:#333;}#mermaid-svg-bfz8y29kjzNp4JZq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-bfz8y29kjzNp4JZq :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
标准输出==标准输入
标准输出==标准输入
cmd1
cmd2
cmd3
使用管道命令的注意点:
参数代换:xargs很多命令其实并不支持管理命令,这样需要使用xargs来提供该命令引用standard input之用。
选取命令以行为单位,截取出需要的部分
排序命令+
字符转换命令
分割命令
数据处理命令
shell中的正则特殊字符语系配置不同导致英文和数字的选取问题,需要记住正则中的特殊符号,不受语系配置影响。
基础正则表达式
扩展正则表达式
shell 脚本程序化脚本,利用shell的功能写一个程序,达到我们的处理能力。脚本是一个以’.sh’为文件后缀名的纯文本文件。shell脚本编写的注意事项
脚本format
表达式判断
脚本的默认变量
shift默认偏移一个变量 条件判断语句if else语句简单的判断条件,若有多个条件可以使用中括号隔开,多个中括号之间可以用
多重、复杂条件判断式
case语句
循环语句while循环当满足判断条件时,执行程序段。
until循环一直执行程序段,之道满足判断条件时,跳出循环。
for循环
|
