Shell编程相关

一、shell是什么?

定义:命令行解析器。为用户提供的一个向Linux内核发送请求以运行程序的界面系统级程序。
也就是 Linux 内核的接口。

使用:用户可以用shell 来启动、挂起、停止、编写程序。shell可以直接调用系统命令

二、shell的分类

Shell主要有两大家族:

1)Bourne Shell:从1979年起Unix 就开始使用的,主文件名为 sh;

Bourne 家族主要有 sh 、 ksh 、 Bash 、 psh 、 zsh;

2)C Shell :主要在 BSD版的 Unix 系统使用,语法类似C语言;

C家族主要有 csh 、 tsch 等。

其中,Bash 与 sh 兼容,为当前 Linux用户的基本shell。

Linux支持的Shell 类型可以在 /etc/shells 文件查看:

在这里插入图片描述
/sbin/nologin in 为伪用户的shell。

伪用户:只在 /etc/passwd 中存在记录,为了方便系统管理、满足系统进程对文件属主的需求而存在的,不能登陆的用户。 如sys 、 adm。

三、Bash shell的命令 read、echo、history 以及执行方式

1、输入命令 read

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、输出命令 echo

命令格式: echo 【可选项】 输出内容

可选项:-e :支持反斜线控制的转义字符

转义字符及其作用如下:
在这里插入图片描述

栗子:

在这里插入图片描述在这里插入图片描述

3 、历史命令保存 history (每个用户各自保存)

命令格式:history 【可选项】 【 可选项:历史命令保存文件】

可选项:
-c:清空历史命令
-w:把缓存的历史命令写入保存文件
ps:不指定文件时 ,默认保存在家目录下的.bash_history文件
默认最大保存 1k 条,可以在 /etc/profile文件中修改 HISTORY的值。

4 、shell脚本文件执行方式:

以文件名hello.sh 为栗:

1) chmod 755 hello.sh
./hello.sh
(在目录下执行)

  1. bash hello.sh (此方法不需要有文件的执行权限)

##四 、设置命令别名与Bash常用快捷键

1 、设置别名方式:

1)临时设置:

命令格式: alias 别名='原命令’

栗子:alias vi='vim'

删除别名: unalias 别名

2)永久设置:

修改 /root/.bashrc 文件

ps:命令执行顺序:

第一顺位执行绝对路径或者相对路径执行的命令

第二顺位执行别名

第三顺位执行Bash内部命令

第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令

2 、Bash常用快捷键

ctrl+C 强制终止当前命令

ctrl+L 清屏,相当于clear

ctrl+U 删除或剪切光标之前的命令

ctrl+K 删除或剪切光标之后的命令

ctrl+Y 粘贴ctrl+u或者ctrl+K剪切的内容

crtl+R 在历史命令中搜索,输入搜索内容就会从历史命令中国搜索

ctrl+D 退出当前终端

五 、Bash的输入输出重定向设置

1、标准输入输出:
在这里插入图片描述

2 、输入重定向

即,如果要从指定文件获得输入而非键盘,可用
命令格式: wc 【可选项】 < 文件名

可选项: -c :统计字节数
-w:统计单词数
-l:统计行数
ps:不加可选项时默认三项都显示。
在这里插入图片描述

3 、输出重定向

同理,当想要命令的执行结果输出到某文件而非屏幕时可用。

有两种方式:

1)将标准输出与标准错误输出各自重定向

在这里插入图片描述
显而易见,这时候如果执行了错误的命令那么对应的文件中是不会有数据的。
为此我们可以:

2)将标准输出与标准错误输出到同一个文件中

在这里插入图片描述
附议:
综上,我们可以发现,
< 就是输入重定向符号,> 就是输出重定向符号;
一个 > 就代表以覆盖方式,两个就代表以追加方式;
>前面带个 2,就代表是错误输出重定向;
>前面带个 &,就代表不管正确错误都重定向到同一个文件中 。

六、多命令执行符 【;】【&&】【||】 以及 管道符【|】

1 、多命令顺序执行的三种方式:

ps:表中第一个多命令执行符为 ; (分号)在这里插入图片描述

2 、管道符 |:将前面命令的结果作为后面命令的操作对象

在这里插入图片描述
栗子:

在这里插入图片描述

七、通配符与 Bash中特殊符号

1 、通配符与作用

在这里插入图片描述
栗子:

在这里插入图片描述

2 、Bash中其他特殊符号

在这里插入图片描述

栗子:

在这里插入图片描述

八 、Bash中的变量(用户自定义、环境变量、位置参数变量、预定义变量

1、用户自定义变量

规则:
1)字母数字下划线组成,不能以数字开头;
2)默认都是字符串类型,需要数值运算时要指定类型;
3)等号两边不能有空格;
4)可用把命令结果作为变量赋值给变量,需要在 $() 或者 `` 中写入命令。

相关命令:

变量调用:echo $a

变量查看:set name

变量删除 unset name

变量叠加栗子:
注意,“”中的$是被当特殊符号处理的哦,区别于单引号
ps:上图中的第三个命令的 ${} 可以不加

2 、环境变量:保存和系统操作环境相关的数据

设置环境变量:(加个export就是环境变量)

export 变量名=变量值

相关命令:

查看环境变量 env

删除环境变量 unset

作用范围:

用户自定义变量只在当前shell中生效,
环境变量会在当前shell以及这个shell的所有子shell中生效,
如果把环境变量写入配置文件,则环境变量在所有的Shell中都生效。

什么是父shell,子shell?

假设我们在当前shell中新建一个bash shell(采用bash命令),采用pstree命令查看进程树,看出有两个bash shell,也就是环境变量会在父子shell中都生效,exit键退出当前shell。

3 、位置参数变量:在脚本中传递参数或数据的,变量名不能自定义

在这里插入图片描述
在这里插入图片描述
运行如图:
在这里插入图片描述

4 、预定义变量:Bash已经定义好的变量,变量名不能自定义。

在这里插入图片描述
在这里插入图片描述

九 、数值运算和运算符

上面我们说到了,shell中的字符都默认是字符串类型,如:

那么要使用数值运算时 ,就要指定类型 。当然,除此之外还有其他方式。

1 、使用数值运算的方式

1)declare 方式:在结果对象前declare - 指定类型

命令格式:declare 【可选项+/-】 【可选项】 变量名

可选项:

+:取消变量的类型属性

-:给变量设定类型属性

-i:将变量声明为整数型

-x:将变量声明为环境变量

-p:显示指定变量的类型

栗子 ,依旧是上方的 a1、a2,
在这里插入图片描述

2) let 方式:在结果对象前加 let

栗:let c=a1+a2
此时结果亦是33

3)expr 方式:在运算前方加expr ,但要注意 ,后边的项与符号之间必须有空格。

ps:expr还可以用来计算字符串长度等。

在这里插入图片描述
记得上面说过的,将命令结果给变量赋值时要加 $() 或者 ``

4)$(()) 方式:在运算式外方套 $(()),不用加 $()
在这里插入图片描述

  1. $[ ] 方式:在运算式外方套 $[ ],不用加 $()

在这里插入图片描述

2、运算符

在这里插入图片描述

十、变量测试与内容替换

在这里插入图片描述

在这里插入图片描述

十一、环境变量 及其相关配置文件、配置过程

1 、先介绍一个可以让配置文件修改完就可以直接生效而不需要重启或者退出shell的命令:

source命令

命令格式:source 配置文件

2、环境变量配置文件

定义:主要定义对系统的操作环境生效的系统默认环境变量,如 PATH 、HISTORY、PS1、HOSTNAME等。

可以用env 来查看有哪些环境变量 。

系统主要的环境变量配置文件:

a) /etc/profile

b) /etc/profile.d/*.sh

c) /etc/bashrc

d) ~/.bash_profile

e) ~/.bashrc

前三个对所有用户生效,后两个只对当前用户生效,而且是隐藏文件,但是具有优先级。

既然有这么多个相关文件,那到底按照哪个来配置呢?

3 、系统环境变量的配置过程

两种情况:

1)正常登录,输入用户名和密码 ,流程如下:(先往下再往右)

在这里插入图片描述
step1:读取 /etc/profile,让我们来瞅瞅这个文件:

在这里插入图片描述

在这里插入图片描述

可以看到,文件中定义了:

[1]. USER变量

[2]. LOGNAME变量

[3]. MAIL变量

[4]. PATH变量

[5]. HOSTNAME变量

[6]. HISTSIZE变量

[7]. umask

[8]. 调用/etc/profile.d/*.sh文件

从截图可以看到 ,从 67 行就开始

step2:执行 /etc/profile.d/*.sh 的所有文件,那么 ,让我们来瞅瞅都有哪些文件:
在这里插入图片描述
其中,lang.sh 为编码方式,并且 ,在文件中可能执行了 /etc/sysconfig/i18n 文件

在这里插入图片描述
step3:下面执行完了,便开始执行右边的 ~/.bash_profile:

在这里插入图片描述
文件中,先查看~/.bashrc文件是否存在,如果存在,执行source ~./bashrc(等同于 . ~/.bashrc),
然后在PATH系统变量后加上$HOME/bin。

~/.bashrc文件:

在这里插入图片描述
可以看到,
~/.bashrc的主要功能是定义命令别名,然后查看是否存在/etc/bashrc,存在就继续执行。

/etc/bashrc文件:
在这里插入图片描述
主要功能是PS1的显示,也就是在这里插入图片描述

初始登录显示那些信息,即命令提示符。

第46行里有一句判定是否是nologin的shell如果是nologin的话继续如下执行,如果不是nologin的就结束。

2)切换到子 shell 或者 nologin 的登录:

在这里插入图片描述

注,配置过程中,后面修改的环境变量会把前面修改的覆盖掉(注意的看到系统是以:追加的方式而不是以覆盖的方式修改的),也就是/etc/bashrc优先级最高,然后是/.bashrc,然后是/.bash_profile,最低的是/etc/profile,而家目录下(~)的配置文件只对当前目录生效。

十二 、其他的配置文件

在这里插入图片描述

1 、~/.bash_logout:shell注销时环境变量的配置文件

2 、~/bash_history:系统历史命令保存

3 、/etc/issue:本地登录欢迎信息配置文件
在这里插入图片描述
在这里插入图片描述
加上\l ,本地终端logout之后会多了下面的提示

在这里插入图片描述

十三、基础正则表达式

1. 正则表达式和通配符

l 正则表达式通常用于在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等命令可以支持正则表达式

l 通配符(包括*,?,[])用于匹配符合条件的文件名,通配符是完全匹配。ls、find、cp等命令不支持正则表达式,只能由自己的通配符来进行匹配

2、基础正则表达式

在这里插入图片描述

3、扩展正则表达式(grep -E)

a) {n,m}与基础的一致

b) +:匹配前面正则表达式一次或多次

c) ?:匹配前面字符0次或者多次

d) |:表示匹配多个字符串(或的关系)

在这里插入图片描述
在这里插入图片描述

十四 、字符提取命令 grep(提取行) 、cut(提取列)、printf(输出)、awk(提取列)、sed的使用(文本编辑)

1 、grep命令:

提取文件中符合正则表达式规则的行 。

格式:grep 【-E】 文件

可选项-E:表示为扩展正则表达式

ps:与其他有输出命令用管道符连接时则后面无需再加文件名。

2 、cut命令:提取列

格式:cut 【可选项】 文件名

可选项 -f 列号 :提取第几列
-d 分隔符:按照指定的分隔符分隔列(无法以空格为分隔符)

在这里插入图片描述

3、awk命令:提取复合条件的列;因cut 命令无法以空格分隔列。

格式:awk 【‘条件1{动作1}条件2{动作2}…’】 文件名

ps:与其他有输出命令用管道符连接时则后面无需再加文件名。

条件:
关系表达式条件,如:x>10
Begin、End条件,表示在运行awk之前和执行完所有条件之后执行的条件

动作:
1 、格式化输出(print或者printf)
2 、流程控制语句

在这里插入图片描述

Begin条件:在运行awk前进行初始化操作

在这里插入图片描述
End条件:执行完所有条件之后再执行End条件

在这里插入图片描述

动作:FS命令指定分隔符(awk默认分隔符为制表格和空格)

在这里插入图片描述

4 、printf命令:格式化输出(常与awk一起使用,作为其动作)

格式:printf 【‘输出类型输出格式‘】 输出内容

输出类型输出格式:

%ns:输出 n 个字符的字符串
%ni:输出 n 个数字的整数
%m.nf:输出总共 m 个数字的浮点数,其中有 n 位小数,m - n位整数

5 、sed命令:

一种轻量级流编辑器 ,主要用于对文本数据进行选取 、替换 、删除、新增等操作。

格式:sed 【可选项】 ‘【动作】’ 文件名

可选项:
-n:只把经过sed命令处理的行输出到屏幕。(默认输出全部)
-e:允许对数据执行多条 sed 动作,用 ;隔开
-i:用sed 的修改结果直接修改读取数据的文件,而不是屏幕输出

动作:
a:在当前行后追加一行/多行。追加多行内容时 ,除最后一行以外都要在末尾加“ \” ,代表数据未完结;
c:行替换。替换多行时亦要“ \ “
i:在当前行前插入一行 /多行。插入多行时亦要” \“
d:删除指定的行
p:打印指定的行
s:字符串替换,格式: 行范围s/旧字符串/新字符串/g

ps:前五种动作都是可以指定某行,直接在选项面前加数字,如:2a 指定在第二行后面追加;
2,4d 删除2,4行

打印第四行,只把处理内容输出

输出重定向
删除2,4行;查看内容

在第二行后面追加

用hda替换第五行的sda

注意:上述命令并不会修改源文件,要修改则加 i 可选项。

十五、文件存在及类型判断 、文件存在及权限判断、文件比较判断 、两数比较判断、字符串比较与判断、多重判断

进行这些判断时,注意直接在命令行判断不加 test 时要加中括号,且中括号与字符之间有空格

1、文件存在及类型判断

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 、文件存在及权限判断

在这里插入图片描述

3 、两个文件的比较判断

在这里插入图片描述
在这里插入图片描述

4 、两个数之间的比较判断

在这里插入图片描述
在这里插入图片描述

5 、字符串比较及之间的判断

在这里插入图片描述
在这里插入图片描述

6 、多重判断

在这里插入图片描述
在这里插入图片描述

十六、流程控制

要注意!if跟后边的条件之间必须有空格!

1. if语句

单分支if条件语句:

格式如下:

if  [ 条件判断式 ];then
        程序
fi

或者

if  [ 条件判断式 ]
        then
                程序
fi

找到输出中以 / 结尾的行,取出第五列,再取以 %为分隔符的第一列的值赋给rate

2. 双分支if条件语句(多了个else)

if [ 条件判断式 ]
        then
                条件成立时,执行的语句
        else
                条件不成立时,执行的语句
fi

在这里插入图片描述

在这里插入图片描述

3. case 语句

a) 语法

case $变量名 in
“值1”)
        如果变量的值等于值1,则执行程序1
        ;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
*)
如果变量的值不等于以上,则执行此程序
;;
                esac

4. for 语句·

a) 语法一

for 变量 in 值1 值2 值3
        do
                程序
        done

例子:批量解压缩

在这里插入图片描述

b) 语法二:

在这里插入图片描述

例子:批量添加用户
--stdin 从标准输入管道读取新密码

  1. while语句(until语句)

a) 语法

while [ 条件判断式 ]
        do
                程序
        Done

例子:用while实现批量创建用户

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值