命令格式: 命令 [-选项] [参数]
例: ls -la /etc
说明:
- 个别命令使用不遵循此格式
- 当有多个选项时,可以写在一起
- 简化选项与完整选项
1. ls(list) 显示目录文件
语法: ls [选项]
-a 显示所有文件,包括隐藏文件
-l 显示详细信息,可简化为ll
-d 查看目录属性
-i 查看目录节点
例: ls -a
2. mkdir(make directories) 创建新目录
语法:mkdir [选项] [目录名]
-p 递归创建 (创建多重目录,如果目录不存在时,自动创建目录)
例: mkdir -p /tmp/test/linux
mkdir /tmp/test/linux (如果test不存在是会报错)
3. cd(change directory) 切换目录
语法:cd [目录]
例:cd /tmp/test/linux 切换到指定目录
cd … 回到上一级目录
4. pwd(Print Working Directory) 显示当前目录位置
5. rmdir(remove empty directories) 删除空目录
语法: rmdir [目录名]
例:rmdir /tmp/test/linux
6. cp(copy) 复制文件或目录
语法:cp [选项] [原文件目录] [目标目录]
-r 复制目录
-p 保留文件属性
例:cp -r /tmp/test/linux /root 将目录/tmp/test/linux复制到目录/root下
cp -rp /tmp/test/linux /root 将目录/tmp/test/linux复制到目录/root下,保持目录属性
7. mv(move) 剪切文件、改名
语法:mv [原文件或目录] [目标目录]
例:mv /tmp/test/linux /root 将/tmp/test/linux剪切到/root
mv /tmp/test/linux /root/unix 将/tmp/test/linux剪切到/root,并改名unix
8. rm(remove) 删除文件
语法:rm [选项] [文件或目录]
-r 删除目录
-f 强制执行
例: rm /tmp/test/test.sh 删除文件test.sh,系统会询问是否删除
rm -r /tmp/test/linux 删除目录
rm -rf /tmp/test/linux 强制删除目录,不用询问
rm -rf / 跑路
1. touch 创建空文件
语法:touch [文件名]
例: touch linux.list 可同时创建多个文件
2. cat 显示文件内容
语法:cat [选项] 文件
-p 显示行号
例:cat /etc/issue
cat -n /etc/service
3. more 分页显示文件内容
语法:more [文件名]
(空格) 或f 翻页
(Enter) 换行
q或Q 退出
例:more /etc/services
4. vi/vim 创建文件
语法:vi/vim 文件
例:vim test.sh
5. ln(link) 生成链接文件
语法:ln -s [原文件] [目标文件]
-s 创建软链接文件
软链接特征:类似Window快捷方式,文件大小只是符号大小,箭头指向原文件
硬链接特征:除了文件路径,其它都一样
例:ln -s /etc/issue /tmp/issue.soft 创建文件/etc/issue的软链接/tmp/issue.soft
ln /etc/issue /tmp/issue.hard 创建文件/etc/issue的硬链接/tmp/issue.hard
文件权限:-rw-r–r--
第一个字符:‘-’ 文件类型 (- 二进制文件,d 目录, l 软链接文件)
rwxrw-r–
764
1. chomd 改变文件或目录权限
语法: chmod [{ugoa} {±=} {rwx}] [文件或目录]
[mode=421] [文件目录]
-R 递归修改
例:chmod u+x 文件名 给所有者添加执行的权限
chmod g+w,o-r 文件名 给所属组添加写的权限,去掉其他人读的权限
chmod g=rwx 文件名 给所有者添加读写执行的权限
chmod 640 文件名 依照数字来赋予权限
说明:对目录有写权限才可删除文件
2. chown 改变文件或目录的所有者
语法:chown [用户] [文件或目录]
例:chown king test.sh 改变文件test.sh的所有者为king
说明:只有root可操作,所有者不可操作
3. chgrp 改变文件或目录的所属组
语法:chgrp [用户组] [文件或目录]
例:chgrp lampbrother test.sh 改变tesh.sh的所属组为lampbrother
4. umask 显示、设置文件的缺省权限
语法:umask [-S]
-S 以rwx的形式显示新建文件缺省权限
例:umask -S
1. find 文件搜索
语法:find [搜索范围] [匹配条件] (配合通配符使用)
例: find /etc -name init 在目录/etc中查找文件init -iname不区分大小写
find / -size +204800 在根目录下查找大于100MB的文件 +n大于 -n小于 n等于
find /home -user king 在根目录下查找所有者为king的文件 -group 根据所属组查找
find /etc -cmin -5 在/etc下查找5分钟内被修改过属性的文件和目录
(-amin 访问时间access,-cmin 文件属性change,-mmin 文件内容modify)
find /etc -size +163840 -a -size -204800 在/etc下查找大于80MB小于100MB的文件
(-a 两个条件同时满足,-o 两个条件满足任意一个即可)
find /etc -name inittab -exec ls -l {} 在/etc下查找inittab文件并显示其详细信息
(-exex/-ok 命令{}; 对搜索结果执行操作)
-type 根据文件类型查找
-inum 根据i节点查找
2. locate 在文件资料库中查找文件
语法:locate 文件名
例: locate inittab 新建文件要先更新资料库updatedb才可查找
3. which 搜索命令所在目录及别名信息
语法:which [命令名称]
例:which ls
4. grep 在文件中搜寻字符串匹配的行并输出
语法:grep -iv [指定字串] [文件]
-i 不区分大小写
-v 排除指定字串
例:grep mysql /root/install.log
5. man 获得帮助信息
语法:man [命令或配置文件]
例:man ls 查看ls命令的帮助信息
man services 查看配置文件services的帮助信息
6. help 获得Shell内置命令的帮助信息
语法:help 命令
例:help umask 查看umask命令的帮助信息
1. useradd 添加新用户
语法:useradd 用户名
2. passwd 设置用户密码
语法:passwd 用户名
例:passwd jjj
3. who 查看登录用户信息
语法:who
(tty:本地终端,pts:远程终端)
4. w 查看用户详细登录信息
1. gzip 压缩文件
语法:gzip [文件]
压缩后文件格式:.gz
2. gunzip 解压缩.gz的压缩文件
语法:gunzip [压缩文件]
例:gunzip test.gz
3. tar 打包目录
语法:tar [选项] [压缩后文件名] [目录]
-c 打包
-v 显示详细信息
-f 指定文件名
-z 打包同时压缩
压缩后文件格式:.tar.gz
tar命令解压缩语法:
-x 解包
-v 显示详细信息
-f 指定解压文件
-z 解压缩
例:tar -zxvf test.tar.gz
4. zip 压缩文件或目录
语法:zip 选项[-r] [压缩后文件名] [文件或目录]
-r 压缩目录
压缩后文件格式:.zip
5. unzip 解压.zip的压缩文件
解压:unzip [压缩文件]
例:unzip test.zip
6. bzip2 压缩文件
语法:bzip2 选项[-k] [文件]
-k 产生压缩文件后保留原文件
压缩后文件格式:.bz2
例:bzip2 -k test
tar -cjf Test.tar.bz2 Test
7. bunzip2 解压缩
语法:bunzip2 选项[-k] [压缩文件]
-k 解压缩后保留原文件
例:bunzip2 -k test.bz2
tar -xjf Test.tar.bz2
1. write 给用户发信息,以Ctrl+D保存结束
语法:write <用户名>
例:write king
2. wall 发广播信息
语法:wall [message]
例:wall ni shi bu shi sha
3. ping 测试网络连通性
语法:ping 选项 IP地址
-c 指定发送次数
例:ping 192.168.1.156
1. shutdown 关机
语法:shutdown [选项] 时间
-c 取消前一个关机命令
-h 关机
-r 重启
例:shutdown -h now 立即关机
2. 其它关机命令
- halt
- poweroff
- init 0
3. 其它重启命令
- reboot
- init 6
4. 系统运行级别init
- 关机
- 单用户
- 不完全多用户,不含NFS服务
- 完全多用户
- 未分配
- 图形界面
- 重启
5. logot 退出登录命令
Vim是一个功能强大的全屏幕文本编辑器,
是Linux/UNIX上最常用的文本编辑器,
它的作用是建立、编辑、显示文本文件
Vim没有菜单,只有命令。
导入名令执行结果:r !命令
定义快捷键:map 快捷键 触发命令
例: :map ^p I#
:map ^B 0x
grep是行过滤工具;用于根据关键字进行过滤
语法和选项
语法:
常见选项:
cut是列截取工具,用于列的截取
语法和选项
语法:
常见选项:
举例说明:
课堂练习
用小工具列出你当前的系统运行级别
- 如何查看系统运行级别
- 命令runlevel
- 文件/etc/inittab
- 如何过滤运行级别
sort工具用于排序;它将文件的每一行作为一个单位,从首字符向后,依次按ASCII码
进行比较,最后将他们按升序输出。
语法和选项
举例说明
uniq用于去除连续的重复行
Tab只能补全命令和文件 (RHEL6/Centos6)
- 双引号" " : 会把引号的内容当成整体来看待,允许通过$符号引用其它变量值
- 单引号’ ’ : 会把引号的内容当成整体来看待,禁止引用其它变量值,shell中特殊符号都被视为普通字符
- 反撇号`` : 反撇号和$()一样,引号或括号里的命令会优先执行,如果存在嵌套,反撇号不能用
-
① Shell的基本语法结构
如:变量的定义、条件判断、循环语句(for、until、while)、分支语句、函数和数组等;
② 基本的正则表达式的运用;
③ 文件处理三剑客: grep、sed、awk工具的使用
④ 使用shell脚本完成一些复杂的任务,如:服务器搭建、批量处理等。
-
目标
- 熟练掌握shell变量的定义和获取(重点)
- 能够进行shell简单的四则运算
shell介于内核与用户之间,负责命令的解释
1. 什么是shell脚本?
简单来说就是将需要执行的命令保存到文本中,按照顺序执行。
它是解释型的,意味着不需要编译。
若干命令 + 脚本的基本格式 + 脚本的特定语法 + 思想 = shell脚本
2. 什么时候用到脚本?
重复化、复杂化的工作,通过把工作的命令写成脚本,
以后仅仅需要执行脚本就能完成这些工作。
3. shell脚本能干啥?
4. 如何学习shell脚本
- 尽可能记忆更多的命令
- 掌握脚本的标准格式(指定魔法字节、使用标准的执行方式运行脚本)
- 必须熟悉掌握脚本的基本语法(重点)
总结:
- shell就是人机交互的一个桥梁
- shell的种类
思考:终端和shell有什么关系?
打开终端默认打开一个shell,终端是一个程序,shell解析命令。
⑴ 脚本第一行,魔法字符#!指定解释器【必写】
#!/bin/bash 表示以下内容使用bash解释器解析
注意:
如果直接将解释器路径写死在脚本里,可能在某些系统就会存在找不到解释器的兼容性问题,
所以可以使用:
⑵ 脚本的第二部分,注释(#号)说明,对脚本的基本信息进行描述【可选】
⑶ 脚本的第三部分,脚本要实现的具体代码内容
-
标准脚本执行方法 (建议)
-
非标准的执行方法(不建议)
-
直接在命令行指定解释器执行
-
编写一个没有灵魂的脚本:
- 删除//tmp/目录下的所有文件 rm -rf /tmp/*
- 然后在/tmp目录里创建3个目录,分别是dir1-dir3 mkdir /tmp/dir{1…3}
- 拷贝/etc/hosts文件到刚创建的dir1目录里 cp /etc/hosts /tmp/dir1
- 最后打印“任务已于2020-09-16 时间完成”内容
变量是用来临时保存数据的,该数据是可以变化的数据。
-
如果某个内容需要多次使用,并且在代码中重复出现,那么可以用变量代表该内容。
这样在修改内容的时候,仅仅需要改变变量的值。
-
在代码运作的过程中,可能会把某些命令的执行结果保存起来,后续代码需要使用这些结果,
就可以直接使用这个变量。
变量名=变量值
变量名:用来临时保存数据的
变量值:就是临时的可变化的数据
-
变量名区分大小写
-
变量名不能有特殊符号
-
变量名不能以数字开头
-
等号两边不能有任何空格
-
变量尽量做到见名知意
㈠ 基本方式
直接赋值给一个变量
㈡ 命令行结果赋值给变量
㈢ 交互式定义变量(read)
目的:让用户自己给变量赋值,比较灵活
语法:
常见选项:
举例说明:
㈣ 定义有类型的变量(declare)
**目的:**给变量一些限制,比如整数、只读。
用法:
常用选项:
㈠ 本地变量
- 本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。
㈡ 环境变量
- 环境变量:当前进程有效,并且能够被子进程调用,
- 查看当前用户的环境变量
- 查询当前用户的所有变量(临时变量与环境变量)
- 变量名=变量值 或者 变量名=变量值;export 变量名
㈢ 全局变量
-
全局变量:全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用
-
解读相关配置文件
说明:以上文件修改后,都需要重新source让其生效或者退出重新登录。
㈣ 系统变量【重要】
- 系统变量(内置bash中变量):shell本身已经固定好了它的名字和作用。
- 进一步了解位置参数{n}
算数运算:默认情况下,shell就只能支持简单的整数运算
运算内容:加(+)、减(-)、乘(*)、除(/)、求余数(%)
- 对变量的值的影响
- 对表达式的值的影响
- 熟悉条件判断语句,如判断整数、判断字符串等
- 熟悉流程控制语句基本语法,如if…else…
㈠条件判断语法格式
- 格式1:test条件表达式
- 格式2:[ 条件表达式 ]
- 格式3:[[ 条件表达式 ]] 支持正则 =-
特别说明:
1)[ 两边都有空格 ]
2)[[ 两边都有空格 ]]
3)更多判断,man test去查看,很多的参数都用来进行条件判断
㈡条件判断相关参数
问:你要判断什么?
答:我要判断文件类型,判断文件新旧,判断字符串是否相等,判断权限等等…
①判断文件类型
举例说明:
②判断文件权限
③判断文件新旧
说明:这里的新旧是指
④判断整数
⑤判断字符串
⑥多重条件判断
特别说明:
&& 前面的表达式,才会执行后面的代码
|| 前面的表达式,才会执行后面的代码
; 只用于命令或表达式
举例说明:
- 数值比较
- 类C风格的数值比较
关键词:选择
㈠基本语法结构
①if结构
F:表示false,为假
T:表示true,为真
②if…else结构
随堂练习
让用户自己输入字符串,如果用户输入的还hello,请打印world,否则打印“请输入hello”
- read定义变量
- if…else…
③if…elif…else结构
④层层嵌套结构
㈡应用案例
①判断两台主机是否ping通
需求:判断当前主机是否和远程主机ping通
思路
-
使用哪个命令实现
-
根据命令的执行结果状态来判断是否通
-
根据逻辑和语法结构来编写脚本(条件判断或者流程控制)
落地实现
②判断一个进程是否存在
**需求:**判断web服务器中httpd进程是否存在
思路
- 查看进程的相关命令 ps pgrep
- 根据命令的返回状态值来判断进程是否存在
- 根据逻辑用脚本语言实现
落地实现
③判断一个服务是否正常
**需求:**判断门户网站是否能够正常访问
思路
- 可以判断进程是否存在,用/etc/init.d/httpd status判断状态等方法
- 最好的方法是直接访问一下,通过访问成功和失败的返回值来判断
- Linux环境,wget,curl ,elinks -dump
落地实现
㈢课堂练习
①判断用户是否存在
**需求1:**输入一个用户,用脚本判断该用户是否存在
㈠列表循环
列表for循环:用于将一组命令执行已知的次数
- 基本语法格式
- 举例说明
㈡不带列表循环
不带列表的for循环执行时由用户指定参数和参数的个数
- 基本语法格式
- 举例说明
㈢类C风格的for循环
- 基本语法结构
㈠脚本计算1-100奇数和
①思路
- 定义一个变量来保存奇数的和
- 找出1-100的奇数,保存到另一个变量里
- 从1-100中找出奇数后,再相加,然后将和赋值给变量
- 遍历完毕后,将sum的值打印出来
②落地实现
③循环控制语句
循环体:之间的内容
- continue:继续;表示内下面的代码不执行,重新开始下一次循环
- break:打断;马上停止执行本次循环,执行后面的代码
- exit:表示直接跳出程序
㈡判断所输整数是否为质数
**质数(素数):**只能被1和它本身整除的数叫质数。
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
①思路
- 让用户输入一个数,保存到一个变量里
- 如果能被其它整其它数整除就不是质数——>i是否等于0 num-1
- 如果输入的数是1或者2取模根据上面判断又不符合,所以排除1和2
- 测试序列从2开始,输入的数是4——>得出结果i相等,并且i
②落地实现
㈢批量创建用户
需求:批量加5个新用户,从u1到u5命名,并统一加一个新组,组名为class,统一改密码为123
①思路
- 添加用户的命令
- 判断class组是否存在
- 根据题意,判断该脚本循环5次来添加用户
- 给用户设置密码,应该放到循环体里面
②落地实现
㈠批量创建用户
**需求1:**批量新建5个用户stu1-stu5,要求这几个用户的家目录都在/rhome.
㈡局域网内脚本检查主机网络通讯
需求2:写一个脚本,局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里。
**特点:**条件为真就进入循环;条件为假就退出循环
㈠脚本计算1-50偶数和
㈡脚本同步系统时间
①具体需求
- 写一个脚本,30秒同步一次系统时间,时间同步服务器192.168.88.253
- 如果同步失败,则进行邮件报警,每次失败都报警
- 如果同步成功,也进行邮件通知,但是才通知
②思路
- 每个30s同步一次时间,该脚本是一个死循环 while
- 同步失败发送邮件
- 同步成功100次发送邮件
③落地实现
**特点:**条件为假就进入循环;条件为真就退出循环
打印1-5数字
㈠具体需求
- 使用until语句批量创建10个用户,要求stu1-stu5用户的UID分别为1001—1005;
- stu6-stu10用户的家目录分别在/rhome/stu6—/rhome/stu10
㈡思路
- 创建用户语句
- 使用循环语句(until)批量创建用户
- 判断用户前5个和后5个
㈢落地实现
系统变量: RANDOM,默认会产生0—32767的随机整数
**前言:**要想调用变量,不管你是什么变量都要给钱,而且是美元$
㈠随机产生以139开头的电话号码
具体需求1:
写一个脚本,产生一个phonenum.txt,随机产生以139开头的手机号100个,每个一行。
①思路
- 产生1000个电话号码,脚本需要循环1000次
- 139+8位,后8位随机产生,可以让每一位数字都随机产生
- 将随机产生的数字分别保存在变量里,然后加上139保存到文件里
②落地实现
㈡随机抽取5位幸运观众
具体需求
- 在上面的1000个手机里抽奖5个幸运观众,显示出5个幸运观众
- 但只显示头3个数和尾号的4个数,中间的都用*代替
①思路
- 确定幸运观众所在的行
- 将电话号码提取出来
- 显示前3个和后4个数到屏幕
②落地实现
㈢批量创建用户(密码随机产生)
**需求:**批量创建5个用户,每个用户的密码为一个随机数
①思路
- 循环5次创建用户
- 产生一个密码文件来保存用户的随机密码
- 从密码文件中取出随机密码赋值给用户
②落地实现
- 一个循环体内又包含另一个完整的循环结构,称为循环的嵌套
- 每次外部循环都会触发内部循环,直至内部循环完成,才接着执行下一次外部循环
- for循环、while循环和until循环可以相互嵌套。
㈠打印指定图案
expect 自动应答 tcl语言
需求1:A远程登录到server上什么都不做
㈠ 数组分类
- 普通数组:只能使用整数作为数组索引(元素的下标)
- 关联数组:可以使用字符串作为数组索引(元素的下标)
㈡ 普通数组定义
- 一次赋予一个值
- 一次赋予多个值
㈢ 数组的获取
㈣ 关联数组定义
① 首先声明关联数组
② 数组赋值
- 一次赋一个值
- 一次赋多个值