Linux shell变成

bash基础知识

shell为我们Linux提供了编程环境
程序=指令+数据
程序编程风格:
过程式:以指令为中心,数据服务于命令
对象式:以数据为中心,命令服务于数据
shell是一种过程式编程
过程式编程:
顺序执行
循环执行
选择执行
shell脚本文件:文件扩展名通常是.sh
#!/bin/bash 指明这个以/bin/bash作为shell翻译
运行脚本:
给予可执行权限(chmod +x test.sh),通过具体的文件执行
直接运行shell解释器,将脚本作为解释器程序的参数进行执行

变量

变量命名
1.命名只能使用英文字母,数字和下划线,且首字母不能以数字开头
2.不能使用标点符号
3.不能使用bash中的关键字
变量示例:running,eagles_lab,
-语句给变量赋值
for file in ‘ls /tmp/‘
建议大家在使用变量的时候尽量用{}号作为边界
只读变量:将变量定义为只读变量之后就不能进行修改
关键字:readonly var_name
删除变量
关键字:unset var_name

变量的类型

本地变量:生效范围为当前shell进程,(其他shell,当前的子shell进程中均无效)
环境变量,生效范围为当前shell进程及其子进程等
局部变量:生效范围为当前shell进程中某代码片段(通常指函数)
位置变量:1,2,3……来表示,让脚本在执行代码中通过调用命令行传递给他的参数
特殊变量:?,0,*,@,$,#

本地变量

var_name=“value”

环境变量

关键字:export/declare 声明
1.export name=“value”
2.declare -x name=“value”

局部变量

位置变量

$1,$2,$3……,对应调用第1,2,3个参数
$0代表命令本身
$*:传递给脚本的所有参数(会把所有参数当作整体)
$@:传递给脚本的所有参数
$#:传递给脚本的所有参数的个数

案例一:判断所给文件的行数

输入:linecount.sh
输出:文件的行数
image.png

shell数组

语法格式:array_name={value value2 ……}
示例:
my_array={Linux python “go” Java}
获取数组中元素
${my_array[0]} #获取数组中的指定元素
${my_array[]} #获取数组中的所有元素,或echo ${my_array[@]}
如何修改数组中元素的值:array_name[index]=“value”
获取数组的长度(元素个数): ${#my_array[
]}

shell环境配置

bash配置文件
按生效范围分类
全局配置
/etc/bashrc
/etc/profile
/etc/profile.d/.sh
个人配置
~/.bash_profile
~/.bashrc
功能
用于定义环境变量
运行命令或脚本
功能分类
profile类:为交互式的shell提供配置
全局:/etc/profile /etc/profile.d/
.sh
个人:~/.bash_profile
bashrc类:为交互式的shell提供配置
全局
个人
功能
定义变量别名
定义本地变量
shell登录
交互式登录
读取bash配置文件的顺序
非交互式登录
读取bash配置文件的顺序
总结:
交互式登录先读取profile类(全局配置->个人配置),再读bashrc类(个人配置->全局配置)
非交互式登录限度bashrc类(个人配置->全局配置),再度profile类
编辑配置文件定义的新设置的生效方式
1.重启shell进程
断开当前shell重新连接或者直接输入bash命令
2.使用source命令
source /etc/profile
bash中的算术运算符:
完成算术运算符
image.png增强型赋值:+= -=
乘法符号有些场景可能需要进行转义:*\
随机生成器:$RANDOM

练习题

计算/etc/passwd文件中第10个用户和第20个用户的ID之和
image.png
传递两个文件路径参数给脚本,计算这两个文件中所有空白行的数量
image.png
统计目录下一共有多少个子目录和文件
image.png

条件测试

bash条件测试
判断某些需求是否满足,需要由测试机制来实现专用的测试表达式,需要由命令辅助完成测试过程
测试命令:test experssion
测试类型:
数值测试
字符串测试
文件测试
数值测试
大于
小于
大于等于:-ge
小于等于
等于
不等于
字符串测试
==:是否等于
>:是否大于
<:是否小于
!=:是否不等于
=~:左侧字符串是否能够被右侧字符串所匹配
Note:此表达式一般用于[[]]中
-z
-n
文件测试
简单的文件测试
-a file :文件存在性测试,存在未真,不存在为假
存在性文件类型测试:
-f file:是否为普通文件类型
-d file:是否为目录文件类型
-l file:是否为链接文件类型
-s file:是否为socket文件类型
-c file:是否为字符文件类型
-p file:是否为管道文件类型
-b file:是否为块文件类型
文件权限测试
是否拥有读权限
是否拥有写权限
是否拥有执行权限
文件特殊权限测试
是否拥有sgid权限
是否拥有suid权限
是否拥有sticky权限
文件大小测试:
-s file:是否为空文件
文件是否打开
-fd:表示文件描述符是否已经打开且与终端相关(fd文件描述符:当系统调用open()函数的时候会返回一个fd句柄)
-N file:文件自上一次读取之后是否被修改
-O file:当前文件是否为文件的属主
-G file:当前有效用户是否为文件属组
双目测试
file1 -ef file2 : 判断file1与file2是否指向同一个设备上的inode(软链接)
file1 -nt file2:file1是否新于file2
file1 -ot file2:file1是否旧于file2
组合测试条件
逻辑运算符
第一种方式
&&:与
||:或
!:非
第二种方式
-a:与
-o:或
!:非
格式:条件测试1 && 条件测试2
bash退出码
脚本中一旦遇到exit命令,脚本会立马终止,终止退出码取决于exit命令后的数字
exit [N] #N:代码bash 退出码
如果没有给脚本指定的退出码,整个脚本的退出码取决于脚本中最后一条命令的执行状态

当使用[[]]进行条件测试的时候,注意条件测试要和[]有空格
选择执行
语法:
1,单分支
if判断条件;then
条件为真的分支代码块
fi

2.单分支(条件为假的分支代码块)
if 判断条件;then
条件为真的分支代码块
else
条件为假的分支代码块

3.多分支
if 条件判断;then
条件为真的分支代码块
elif 条件判断;then
条件为真的的分支代码块
……
else
条件为假的分支代码块
fi

练习题

1.判断年龄大小:如果你的年龄大于18岁,则成年,否则不成年
age=19
if [{$age} -ge18];then
echo “old man”
else
echo “young man”
if

2.登录验证功能:编写脚本,将
image.png
3.文件测试功能:判断一个文件的类型
4.判断两个数是否相等
image.png
5.判断用户是否存在,如果不存在添加用户
image.png

用户交互

read命令

-e:只用于互相交互的脚本
-n:用于限定有多少个字符可以作为有效输入
-p:用于给出提示符
特殊字符生效
特殊字符不生效
用于等待输入的时间,等待时间超过,将继续执行后面的脚本

练习题

1.提示为:“input your name:”,输入姓名之后进行输出
2.读取/tmp/fstab文件,输出格式为linecount:context
3.输入一个文件,判断该文件类型进行输出

用户选择

case

循环结构

for循环
语法
for 变量名 in 列表;do
循环体
done
执行机制:依次将列表中的元素赋值给“变量名”,每次赋值之后都执行一次循环体

练习题

1.创建用户user1-user10家目录,并在user1-user10的家目录下创建1.txt-10.txt
2.列出/var/下各个子目录占据磁盘的大小

while循环
语法
until循环体

练习题:打印九九乘法表

函数

domofun函数