一.用户管理
1用户操作
用户添加
useradd [option] 用户名
option:
-c comment 指定一段注释性描述。
-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
-g 用户组 指定用户所属的用户组。
-G 用户组,用户组 指定用户所属的附加组。
-s Shell文件 指定用户的登录Shell。
-u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号
#创建一个用户,如果没有指定组,则默认创建xm组
[root@localhost]# useradd xm
#指定一个目录作为新建用户的目录
[root@localhost]# useradd -d /home/tiger xh
#为用户指定密码
[root@localhost]# passwd xm
删除用户
userdel [option] 用户名
#删除用户xm,但是保留家目录
[root@localhost]# userdel xm
#删除用户以及删除家目录
[root@localhost]# userdel -r xm
查询用户信息
[root@localhost]# id root
#用户Id 组id 组名称
uid=0(root) gid=0(root) 组=0(root)
切换用户
su 用户名
#切换用户,从权限高的用户切换到低级别用户不需要密码。
[root@localhost]# su zf
#回退到原先用户
[root@localhost]# exit
2用户组
类似于角色,用于管理用户,赋予特定的权限
增加组
groupadd 组名
#创建一个组
[root@localhost]# groupadd wd
删除组
[root@localhost]# groupdel 组名
#例子
[root@localhost]# groupdel wd
新建用户时指定组
useradd -g 用户组 用户
# 新建一个zwj的用户,分配到wudang组中
[root@localhost]# groupadd wudang
[root@localhost]# useradd -g wudang zwj
修改用户组
usermod -g 用户组 用户
#案列演示,创建一个shaolin,将zwj修改到shaolin组
[root@localhost]# groupadd shaolin
[root@localhost]# usermod -g shaolin zwj
3用户和组的相关文件
用户配置文件
/etc/passwd
文件格式:**zwj**:x:1004:1007::/home/zwj:/bin/bash
说明: zwj是用户名,x为用户密码(加密),1004用户Id,1007组Id,/home/zwj家目录
/bin/bash 对应的shell 解析器
组配置文件
/etc/group
shaolin:x:1007:
组名:口令:组标识号:组内用户列表
口令配置文件(密码)
/etc/shadow
zwj:!!:18109:0:99999:7:::
二.Linux实用指令
Linux 运行级别:
0 关机
1单用户 (找回密码)
2多用户无网络
3多用户有网络
4保留级别
5图形界面
6重启
系统的运行级别配置文件位于 /etc/inittab
文件。
切换到指定运行级别的指令
init 【0,1,2...】
通过运行级别找回丢失的密码
进入到单用户模式,然后修改root密码就可以
1:开机引导时输入 回车键或者E键 -> 看到一个界面输入e->看到一个新页面选中第二行,在输入e->在这行最后输入1,在输入回车键->输入b
linux 帮助指令
当我们对某个指令不熟悉的时候可以使用帮助指令。
man [命令或配置文件]
help [命令]
文件目录类指令
pwd指令
显示当前工作目录
mkdir
mkdir [选项] 要创建的目录
#创建一个目录
[root@localhost]# mkdir /home/dog
#-p创建多级目录
[root@localhost]# mkdir -p /xxx/xxx
rmdir
删除空目录
rmdir [选项] 空目录
#删除的是asd这个目录
[root@localhost]# rmdir /home/lgb/asd
#删除有文件的目录,asd
[root@localhost]# rm -rf /home/lgb/asd
cp 拷贝指令
cp指令拷贝文件到指定目录
#基本语法
cp [选项] source dest
常用选项
-r:递归复制整个文件夹
#将aaa.text 拷贝到 /home/lgb下
[root@localhost]# cp aaa.txt /home/lgb
#将 test 目录和下面所有的文件拷贝到 /home/lgb下
[root@localhost]# cp -r test/ /home/lgb
rm指令
rm 移除文件或目录
rm [选项] 要删除的文件或目录
常用选项
-r:递归删除整个文件夹
-f:直接删除不提示
删除文件
rm -f aaa.txt
#删除目录,如下命令是删除 aaa 整个目录
[root@localhost]# rm -rf home/lgb/aaa
mv 指令
移动文件与目录或者重命名
#重命名
mv oldFile newFile
#移动文件
[root@localhost]# mv /temp/file /xxx/xxx/xxx
cat more less 指令
cat 指令查看文件内容
cat [option] file
常用选项:
-n:显示行号
#cat与more 分页显示,空格切换下一页内容
cat -n file | more
more 指令
more 指令是一个基于vi编辑器的文本过滤器,按页显示文本内容
基本语法
more file
操作 功能说明
空格 向下翻一页
Enter 向下翻一行
q 不在显示该文件
Ctrl+F 向下滚一屏
Ctrl+B 返回上一屏
= 输出当前行号
:f 输出文件名和当前的行号
less 指令
lessz指令 用来分屏查看文件内容,它的功能与more指令类似,但是比more指令更强大,支持各种显示终端。less指令在显示文件内容时,并不是一整次将整个文件加载之后才显示。对于显示大文件有较高的效率
less 要查看的文件
操作 功能说明
空格 向下翻一页
pagedown 向下翻一页
pageup 向上翻一页
/字串 向下搜索【字串】的功能:n向下查找,N向上查找
? 字串 向上搜索【字串】的功能:n向上查找,N向下查找
q离开这个文件
#显示所有行号(包括空行)
[root@localhost]# less -N rsyslog.conf
输出重定向、追加指令
>输出重定向
>>追加
基本语法
ls -l > 文件 (列表的内容写入文件覆盖写)
ls -al >>文件 (列表的内容追加到文件末尾)
cat 文件 >文件 (将文件的内容覆盖后面的文件)
echo "内容" >>文件
echo
输出内容到控制台
echo [option] [输出内容]
#例子1
[root@localhost]# echo $PATH
[root@localhost]# echo "hello"
head指令
head 指令用于显示文件的开头部分内容,默认情况下head指令显示文件的前10行内容
head 文件(查看文件的前10行内容)
heand -n 5 文件 (查看文件前5行内容)
tail 指令
tail 用于输出文件中尾部的内容,默认情况下,显示文件的后10行内容
tail 文件 (查看文件后10行的内容)
tail -n 5 文件 (查看文件后5行的内容)
tail -f 文件 (**实时查看文件所有更新**)
ln 软连接指令
软连接也叫符号链接,存放了链接其他文件的路劲
ln -s [源文件或目录] [软连接名]
#删除软连接,最后面不要加'/',否则提示资源忙
rm -rf 连接名
history
查看历史指令
# 查看最近的n条指令,如果不加参数则列出所有指令
hostiry [n]
三.时间日期类
date指令
显示当前日期
date
date "+%Y"
date "+%m"
date "+%d"
#显示年月日
date "+%Y-%m-%d"
案列
# date -s 字符串时间 (设置系统时间)
[root@localhost]# date -s "2018-12-12 11:11:11"
cal
日历显示
#显示2020年一整年日历
[root@localhost]# cal 2020
搜索查找指令
find 指令
find 指令将从指定目录向下递归遍历各个子目录,将满足条件的文件或目录显示在终端。
find [搜索范围] [选项] xxx
选项说明:
-name<查询方式> 按照指定的文件名查找文件
-user<用户名> 查找属于指定用户的文件
-size<文件大小> 按照指定的文件大小查找文件
#查找hello.txt文件
find /hone -name hello.txt
#查找属于root用户的 的文件
[root@localhost]# find /opt -user root
#查找大文件,超过20M的文件(大于+,小于-,等于什么都不输入)
[root@localhost]# find / -size +20M
locate 指令
locate 指令可以快速定位文件路劲。locate指令利用事先建立的所有的文件名称及路劲 的locate数据库实现快速定位给定的文件。Locate指令无需遍历整个文件系统。为了保证查询的准确性,管理员必须定期更新locate时刻。
特别说明:由于locate指令基于数据库进行查询,所以第一次运行前,必须使用updatedb指令创建locate数据库
locate 搜索文件
grep指令和管道符号
grep 过滤查找,管道符“|” 表示将前一个命令的处理结果输出传递给后面的命令处理
grep [选项] 查找内容 源文件
选项
-n 显示匹配行和行号
-i 忽略大小写字母
#查找 hello.txt文件中的yes,显示行号
[root@localhost]# cat hello.txt | grep -n yes
四 linux 组管理和权限管理
文件1.所有者2.所在组3.其他组。
一般文件的创建者即为所有者。
组的创建
groupadd 组名
#将用户添加到某个组
useradd -g 组名 用户名
文件/目录,用户所有者管理
修改文件所有者
#查看文件所有者
ls -ahl
#修改文件所有者,并不会改变文件所在组
chown 用户名 文件名
修改文件所在组
#修改文件所在组
chgrp 组名 文件名
修改用户所在组
#改变用户所在组
usermod -g 组名 用户名
#改变用户所登录的初始目录
usermod -d 目录名 用户名
权限的基本介绍
ls -l 会显示如下内容
drwxr-xr-x. 1 root root 6 7月 19 2018 123.txt
0-9位说明
(1)第0位确定文件类型(d - l c b)
-:表示普通文件
d:表示是目录
l:表示软连接文件
c:表示字符设备,键盘鼠标等外设
b:块文件,硬盘
(2)第1-3位确定所有者权限
(3)第4-6位确定所在组权限
(4)第7-9位确定其他用户对该文件的权限
rwx 权限详解
r=4 w=2 x=1
rwx作用到文件
【r】代表可读:可以读取查看
【w】代表可写:可以修改,但是不代表可以删除该文件,删除文件的前提是对该文件所在的目录有写权限。
【x】代表可执行:可以被执行
rwx作用到目录
【r】代表可以读取:ls查看内容
【w】代表可写:可以修改,目录内创建+删除+重命名目录
【x】可执行:可以进入该目录
修改权限 chmod 指令
通过chmod 指令,可以修改文件或者目录的权限。
第一种方式:+ - = 变更权限
u:所有者 g:所属组 o:其他人 a:所有人(u,g,o的总和)
chmod u=rwx,g=rx,o=x 文件目录名
chmod o+w 文件目录名
chmod a-x 文件目录名
#给aaa文件赋予权限,所有者rwx,所在组rx, 其他组rw
[root@localhost]# chmod u=rwx,g=rx,o=rw aaa.txt
#给所有者去除x权限,所在组增加w权限
[root@localhost]# chmod u-x,g+w aaa.txt
#给所有人添加读权限
[root@localhost]# chmod a+r aaa.txt
第二种方式:通过数字变更权限
规则:r=4 w=x x=1 rwx=4+2+1=7
chmod u=rwx,g=rx,o=x 文件目录名
相当于
chmod 751 文件目录名
修改文件所有者
#修改文件所有者
chown newowner file
#修改文件所有者和所有组
chown newowner:newgroup file
-R 如果是目录则递归修改所有子文件
案列演示
#修改/home/abc.txt 文件所有者为用户tom
[root@localhost]# chmod tom /home/abc.txt
#将 /home/kkk 所有的文件的所有者修改为 tom
[root@localhost]# chown -R tom /home/kkk
#修改/home/kkk 的所有者和所属组
[root@localhost]# chown —R tom:police /home/kkk
五.定时任务调度
crontab 进行定时任务的设置。
任务调度:是指系统在某个时间执行特定的命令程序。
任务调度分类:
1.系统工作:有些重要的干工作必须周而复始的执行
2.个别用户工作:个别用户可能希望执行某些程序,定期清除日志等
crontab [选项]
#重启调度任务
service crond restart
常用选项
-e 编辑定时任务
-l 查询定时任务
-r 删除当前用户所有的定时任务
案列:调度任务直接执行指令
#新增一个调度任务
[root@localhost ~]# crontab -e
#加入如下命令并保存,该指令是每个小时的每分钟都执行 ls -l /etc >> /tmp/to.txt
*/1 * * * * ls -l /etc >> /tmp/to.txt
#一分钟后打开 /tmp/to.txt 文件查看文件内容
[root@localhost ~]# vim /tmp/to.txt
占位符说明
第一个* : 一个小时中的第几分钟 0~59
第二个* : 一天当中的第几个小时 0~23
第三个* : 一个月当中的第几天 1~31
第四个* : 一年当中的第几个月 1~12
第五个* : 一周当中的星期几 0~7(0和7都代表星期日)
特殊符号说明
* 代表任何时间,比如第一个“*”就代表一小时中每分钟都执行一次的意思
, 代表不连续的时间。比如“0 8,12,16 * * * ” ,就代表每天的8点,12点,16点执行一次
- 代表连续的时间范围。“ 0 5 * * 1-6 ” 代表周一到周六的5点执行命令
*/n 代表每隔多久执行一次。“ */10 * * * * ” 每隔十分钟就执行一次。
案列:调度任务调用脚本
#第一步编写脚本文件 task.sh
date >> /tmp/mydate
#第二步执行crontab -e
[root@localhost ~]# crontab -e
*/1 * * * * task.sh
六.linux 磁盘分区介绍
分区的方式
mbr分区
- 最多支持四个主分区
- 系统只能安装在主分区
- 扩展分区要占一个主分区
- MBR最大只支持2TB,但是拥有最好的兼容性
gtp分区
- 支持无限多个主分区
- 最大支持18EB的大容量(EB=1024PB,PB=1024TB)
- windows7 64位支持gtp
磁盘情况查询
查询磁盘整体使用情况
[root@localhost tmp]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 17G 5.7G 12G 34% /
devtmpfs 471M 0 471M 0% /dev
tmpfs 488M 0 488M 0% /dev/shm
tmpfs 488M 8.1M 480M 2% /run
tmpfs 488M 0 488M 0% /sys/fs/cgroup
/dev/sda1 1014M 170M 845M 17% /boot
tmpfs 98M 0 98M 0% /run/user/0
查询指定目录的磁盘占用情况
#默认为当前目录
df -h /目录
-s 指定目录占用大小汇总
-h 带计量单位
-a 含文件
--max-depth=1 子目录深度
-c 列出明细的同时增加汇总值
案列
#文件 明细汇总 单位 目录深度
[root@localhost]#du -ach --max-depth=1 /opt
#统计/home 文件夹下的文件个数
[root@localhost]# ls -l /home | grep "^-" | wc -l
#统计/home 文件夹下目录的个数
[root@localhost]# ls -l /home | grep "^d" | wc -l
#统计/home 文件下包括子目录中文件的个数
[root@localhost]# ls -lR /home | grep "^-" | wc -l
#统计文件夹下目录的个数,包括子文件夹中的目录
[root@localhost]# ls -lR /home | grep "^d" | wc -l
#以树状显示文件
[root@localhost]# tree
七.linux网络配置
NAT模式
对于vmware 虚拟机来说,windows中有一块虚拟网卡(vmnet8),虚拟网卡的Ip 地址与linux处于同一网段,因此可以通信。
指定固定IP
直接修改配置文件来指定IP,编辑/etc/sysconfig/network-scripts/ifcfg-eth0 ( centos7 下是 fcfg-ens33 )
[root@localhost]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
......
#修改选项,以静态的方式获取IP
BOOTPROTO=static
#这个值要设为yes
ONBOOT=yes
#添加选项
IPADDR=192.168.0.106
#网关与虚拟网卡保持一致
GATEWAY=192.168.0.1
#DNS与网关保持一致
DNS1=192.168.0.1
......
#重启网络配置
[root@localhost]# service network restart
八.进程管理
在 linux 中,每个执行的程序都称为一个进程,每一个进程都分配一个ID 号
每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程。(www服务器)
ps指令
ps指令用来查看目前系统中有哪些正在执行进程,以及进程执行的状况
ps显示的信息选项
PID 进程识别号
TTY 终端机号
TIME 进程所消耗CPU的时间
CMD 进程的执行命令或进程名
命令详情
ps -a 显示当前终端的所有进程信息
ps -u 以用户的格式显示进程信息
ps -x 显示后台进程的运行参数
案列
[root@localhost]# ps -aux | more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.4 191300 4256 ? Ss 06:59 0:15 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 06:59 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 06:59 0:00 [ksoftirqd/0]
%MEM : 占用的内存
VSZ :使用的虚拟内存
RSS : 使用的物理内存
TTY : 终端机号
STAT :进程状态 S 休眠,s表示进程是会话的先导进程 ,R 运行,D 短期等到,Z 僵死进程,T被跟踪或者被停止,N 表示优先级低的进程
TIME :占用CPU总时间
#父进程查看
[root@localhost]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 8月05 ? 00:00:15 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 8月05 ? 00:00:00 [kthreadd]
root 3 2 0 8月05 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 8月05 ? 00:00:00 [kworker/0:0H]
.......
其中 PID 为父进程ID,0表示没有父进程
终止进程 kill killall
kill [选项] 进程号
常用选项
-9 表示强迫进程立即停止
killall 进程名称(通过进程名称杀死进程,支持通配符,批量杀死进程)
查看进程树
pstree [选项]
常用选项
-p : 显示进程的PID
-u : 显示进程的所属用户
#显示进程的PID
[root@localhost]# pstree -p
#显示进程的用户
[root@localhost]# pstree -u
九.服务(service)管理
service 管理指令
#centos6
service 服务名 [start|stop|restart|reload|status]
#centos7
systemctl [start|stop|restart|reload|status] 服务名
案列
#查看防火墙的状况.centos6
[root@localhost]# service iptables status
#查看防火墙状态 cebtos7
[root@localhost]# systemctl status firewalld
#关闭防火墙后,可以windows下使用telnet访问测试,是否能够访问
[root@localhost]# telnet ip 端口
#查看所有网络服务,按 tab 键可以选择按钮。
[root@localhost]# setup
#列出系统有哪些服务
[root@localhost]# ls -l /etc/init.d
chkconfig 指令(永久生效)
chkconfig 命令可以给每个服务的各个运行级别设置 自 启动/关闭
#查看服务清单
chkconfig --list | grep xxx
chkconfig 服务名 --list
#修改是否启动
chkconfig --level 5 服务名 on/off
案列
#查看服务清单
[root@localhost]#c hckconfig --list
#查看 sshd 服务状态
[root@localhost]# service sshd status
#在5的运行级别下打开sshd服务
[root@localhost]# chkconfig --level 5 sshd on
#在所有运行级别下关闭防火墙
[root@localhost]# chkconfig firewalld off
#在所有运行级别下打开防火墙
[root@localhost]# chkconfig firewalld on
重启的时候服务会生效
动态监控进程
top 与 ps 命令很相似。他们都是用来显示正在执行的进程。top与ps 最大的不同之处在于,top是动态监控服务状态
top [选项]
常用选项
-d 秒数 : 指定top指令每隔几秒更新,默认是3秒
-i : 不显示闲置或僵死的进程
-p : 指定进程ID,监控某个进程的状态
交互操作说明
P 以CPU使用率排序
M 以内存使用率排序
N 以PID排序
q 退出top
u 选择用户(输入用户然后回车)
k 杀死哪个进程(输入进程号,然后回车即可)
监控网络状态
netstat [选项]
常用选项
-an 按一定顺序排列输出
-p 显示哪个进程在调用
案列
#查看系统所有的网络服务
[root@localhost]# netstat -anp
#查看某个服务
[root@localhost]# netstat -anp | grep sshd
十.软件包的管理
rpm 软件包的管理
一种用于互联网下载包的打包及安装工具,它包含在某些Linux 分发版中。它生成具有.RPM扩展名的文件。RPM是ReadHat Package Manager(ReadHat软件包管理工具)的缩写。类似windows的setup.exe。
#查询已安装的rpm列表
[root@localhost]# rpm -qa | grep xxx
#查询软件是否安装
[root@localhost]# rpm -a firefox
#查询软件包信息
[root@localhost]# rpm -qi file
#查询软件包中有哪些文件,安装在哪里
[root@localhost]# rpm -ql firefox
#查询某个文件属于哪个软件包
[root@localhost]# rpm -qf /etc/passwd
rpm包名基本格式
一个rpm包名:firefox-45.0.1-1.el6.centos.x86_64.rpm
名称:firefox
版本号:45.0.1-1
适用操作系统:el6.centos.x86_64
表示centos6.x的64位系统
如果是i686m,i386表示32位的操作系统,norach表示通用。
rpm卸载
rpm -e 包名称
#删除火狐,
[root@localhost]# rpm -e firefox
#强制删除 --nodeps
[root@localhost]# rpm -e --nodeps firefox
rpm安装
rpm -ivh rpm路劲
#找到安装包,你需要挂载上我们的安装centos的iso文件,然后到 /media/ #下去找rpm包
#将文件拷贝到 opt下
[root@localhost]# cp firefox-45.0.1-1.el6.centos.x86_64.rpm /opt/
[root@localhost]# cd /opt
[root@localhost]# rpm -ivh firefox-45.0.1-1.el6.centos.x86_64.rpm
yum 软件包的管理
Yum 是一个Shell 前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包
yum 基本指令
#查询yum服务器是否有需要安装的软件
yum list | grep xxx
#安装指定的yum包
yum install xxx
十一.Shell编程
Shell 是一个命令行解释器,它为用户提供了一个向linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell 来启动,挂起,停止甚至是编写一些程序。
脚本格式要求
(1)脚本以 #!/bin/bash 开头
(2)脚本需要有可执行权限
第一个程序例子:
[root@localhost]# vim hello.sh
#!/bin/bash
echo "hello world"
[root@localhost]# ./hello.sh
hello world
[root@localhost]# /root/shell/hello.sh
hello world
#强制执行,没有权限的情况下,不推荐使用
[root@localhost]# sh ./hello.sh
hello world
Shell的变量
Linux Shell 中的变量分为,系统变量和用户自定义变量。
系统变量:PWD , @SHELL , HOME```
显示当前shell中所有变量:set
shell 中变量的定义
定义变量:变量=值
撤销变量 unset 变量
声明静态变量 readonly 变量 ,注意:不能unset
案列
#!/bin/bash
echo "user=$USER"
#定义一个变量
A=100
echo "A=$A"
#撤销变量
unset A
echo "A=$A"
#声明一个静态变量
readonly B="你好"
echo "B=$B"
定义变量的规则
(1)变量名称可以由字母,数字和下划线组成,但是不能以数字开头。
(2)等号俩侧不能有空格
(3)变量名称一般习惯为大写
将命令的返回值赋给变量
(1)A=`ls -la` 反引号,运行里面的命令并把结果返回给变量A
(2)A=$(ls -la) 等价于反引号
案列
#!/bin/bash
RESUTLT=`ls -l /home`
echo "$RESUTLT"
RESUTLT=$(date)
echo "$RESUTLT"
设置环境变量
基本语法
1.export 变量名=变量值 (功能描述:将shell变量输出为环境变量)
2.source 配置文件 (功能描述:让修改后的配置文件立即生效)
3.echo $变量名 (功能描述:查询环境变量的值)
案列
- 在/etc/profile 文件中定义 TOMCAT_HOME 环境变量
TOMCAT_HOME=/opt/tomcat
export TOMCAT_HOME
- 查看环境变量TOMCAT_HOME的值
[root@localhost]# source /etc/profile
[root@localhost]# echo $TOMCAT_HOME
/opt/tomcat
- 在另外一个shell中使用TOMCAT_HOME
#!/bin/bash
echo "tomcat=$TOMCAT_HOME"
注意:设置完成后,需要让其立即生效
技巧多行注释
#!/bin/bash
:<<!
echo ""
RESULT=123
!
位置参数变量
当我们执行一个shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量。
比如:./myshell 100 200 ,这就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息
基本语法
$n (功能描述:n为数字,$0代表命令本身,$1~$9 代表第一到第九个参数,十以上的参数需要用${n},如${10})
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过把每个参数区别对待)
$# (功能描述:这个变量代表命令行中所有参数的个数)
案列
[root@localhost]# vim test.sh
#!/bin/bash
echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "$#"
[root@localhost]# ./test.sh 123 123
./test.sh 123 123
123 123
123 123
2
预定义变量
shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
基本语法
$$ (功能描述:当前进程的进程号PID)
$! (功能描述:后台运行的最后一个进程的进程号)
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0证明上一个命令正确执行;如果这个变量的值为非0(具体值由程序指定),证明上一条命令执行不正确)
案列
[root@localhost]# vim test.sh
#!/bin/bash
echo "当前的进程号=$$"
#以后台方式运行一个进程
./hello.sh &
echo "最后的进程编号=$!"
echo "执行的结果=$?"
运算符
1. $((运算式)) 或 $[运算式)]
2. `expr m + n` (运算符间要有间隔,需要使用反引号括起来)
3. `expr m - n`
4. \* / % 乘 除 取余
案列
[root@localhost]# vim demo.sh
#!/bin/bash
#第一种方式
RESULT1=$(((2+3)*4))
echo "RESULT1=$RESULT1"
#第二种方式
RESULT2=$[(2+3)*4]
echo "RESULT2=$RESULT2"
#使用 expr
TEMP=`expr 2 + 3`
RESULT3='expr $TEMP \* 4'
echo "RESULT3=$RESULT3"
#求俩个参数和
RESULT4=$[$1+$2]
echo "RESULT4=$RESULT4"
[root@localhost]# ./demo.sh 5 5
RESULT1=20
RESULT2=20
RESULT3=20
RESULT4=10
条件判断
判断语句
[ condition ] (注意condition前后要有空格)
#非空返回true,可使用$?验证(0为true,>1为false)
#应用实列
[ atguigu ] 返回true
[] 返回false
[ condition ]&&echo OK || echo notOk 三目运算
常用判断条件
俩个常数的比较
= 字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
按照文件权限进行判断
-r 有读的权限 [ -r /xxx/xxx/xxx ]
-w 有写的权限
-x 有执行的权限
按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并且是一个目录
案列
[root@localhost]# vim demo1.sh
#!/bin/bash
#判断字符串是否相等
if [ "ok" = "ok" ]
then
echo "相等"
fi
#判断 23 是否大于等于 22
if [ 23 -ge 22 ]
then
echo "大于等于"
fi
#判断文件是否存在
if [ -e /root/shell/aaa.txt ]
then
echo "文件存在"
fi
流程控制
if判断
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断 ]
then
程序
elif [ 条件判断式 ]
then
程序
fi
注意:
[ 条件判断式 ] ,中括号和条件判断式之间必须有空格
推介使用第二种方式
案列
[root@localhost ]# vim testif.sh
#!/bin/bash
if [ $1 -ge 60 ]
then
echo "及格了"
elif [ $1 -lt 60 ]
then
echo "不及格"
fi
[root@localhost ]# ./testif.sh 4
不及格
case语句
case $变量名 in
"值1")
程序1
;;
"值2")
程序2
;;
*)
变量值不为以上执行此程序
;;
esca
案列
#!/bin/bash
case $1 in
"1")
echo "周一"
;;
*)
echo "other"
;;
esac
for循环
语法1
for 变量 in 值1 值2 值3...
do
程序
done
案列 @
[root@localhost ]# vim test1.sh
#!/bin/bash
#使用 $*
for i in "$*"
do
echo "$i"
done
echo "======================"
#使用 $@
for j in "$@"
do
echo "$j"
done
[root@localhost ]# ./test1.sh 12 12 12
12 12 12
==========================
12
12
12
语法2
for ((初始值;循环控制条件;变量变化)) (注意:for后面可以没有空格)
do
程序
done
案列
#!/bin/bash
#累加 1-100的和
SUN=0
for((i=1;i<=100;i++))
do
SUM=$[$SUM+$i]
done
echo "$SUM"
while 语法
while [ 条件判断式 ] (说明:注意条件判断式前后要有空格,while 后面要有空格)
do
程序
done
案列
[root@localhost ]# vim a.sh
#!/bin/bash
#命令行输入一个数n,统计 1+...+n的值是多少
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "$SUM"
[root@localhost ]# ./a.sh 134
9045
read读取控制台输入(程序交互的时候)
read (选项) [参数]
选项
-p : 指定读取时的提示符
-t : 指定读取时等待的时间(秒),如果指定时间没有输入则不等待
参数 : 变量,指定读取的变量名
案列
[root@localhost ]# vim read.sh
#!/bin/bash
read -p "请输入参数=" NUM
echo "你输入的参数=$NUM"
#限定输入参数的时间
read -p "请输入参数=" -t 10 NUM2
echo "你输入的第二个参数=$NUM2"
[root@localhost ]# ./read.sh
请输入参数=12
你输入的参数=12
请输入参数=23
你输入的第二个参数=23
系统函数
shell 编程和其它编程语言一样,有系统函数,也可以自定义函数。这里介绍俩个
basename
功能:返回完整路劲最后的 / 部分,常用于获取文件名称
basename [pathname] [suffix]
basename [string] [suffix] (basename 会删掉所有的前缀 包括 最后一个 ‘/’ 字符,然后将字符串显示出来)
suffix 分为后缀,如果指定了,basename会将[string] [pathname] 中的suffix 去掉
案列
basename /home/aaa/text.txt .txt
返回
text
dirname
返回完整路劲最后 / 的前面的部分
dirname 文件路劲
案列
dirname /home/aaa/text.txt
返回
/home/aaa
自定义函数
定义:[] 括号里面的内容是可选的。
[function] funname[()]
{
Action
[return int]
}
调用:funname [参数]
案列
[root@localhost ]# vim hs.sh
#!/bin/bash
function getSum(){
SUM=$[$n1+$n2]
echo "和=$SUM"
}
read -p "第一个数" n1
read -p "第二个数" n2
#调用
getSum $n1 $n2
[root@localhost liguobao]# ./hs.sh
第一个数12
第二个数12
和=24
Shell综合案列
备份数据库,并且删除前十天的备份
dahao@network:/home/test$ vim test.sh
#!/bin/bash
#备份的路劲
BACKUP=/data/backup/db
#当前时间作为文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)
echo "$DATETIME"
echo "备份开始============="
echo "备份的路劲 $BACKUP/$DATETIME.tar.gz"
#数据库用户名密码
#主机
HOST=localhost
#用户名
DB_USER=root
#密码
DB_PWD=Asd123!.
#数据库的名称
DATABASE=smartfactory_server
#创建备份的路劲,如果备份的文件夹不存在则创建
[ ! -d "$BACKUP/$DATETIME" ] && sudo mkdir -p "$BACKUP/$DATETIME"
mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip > sudo $BACKUP/$DATETIME/$DATETIME.sql.gz
#打包文件
cd $BACKUP
sudo tar -zcvf $DATETIME.tar.gz $DATETIME
#删除临时目录
sudo rm -rf $BACKUP/$DATETIME
#删除十天前的备份文件
find $BACKUP -mtime +10 "*.tar.gz" -exec rm -rf {} \;
echo “备份成功”
请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件,例如今天生成的文件为2017-07-05.log, 并且把磁盘的使用情况写到到这个文件中
#!/bin/bash
D=$(date "+%Y-%m-%d")
LOGFILE=$D.log
df -h > $LOGFILE
需求:--统计日志
112.111.12.248 - [25/Sep/2013:16:08:31 +0800]formula-x.haotui.com "/seccode.php?update=0.5593110133088248" 200"http://formula-x.haotui.com/registerbbs.php" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)"
61.147.76.51 - [25/Sep/2013:16:08:31 +0800]xyzdiy.5d6d.com "/attachment.php?aid=4554&k=9ce51e2c376bc861603c7689d97c04a1&t=1334564048&fid=9&sid=zgohwYoLZq2qPW233ZIRsJiUeu22XqE8f49jY9mouRSoE71" 301"http://xyzdiy.5d6d.com/thread-1435-1-23.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
#要求: 统计出每个IP的访问量有多少?
[root@localhost liguobao]# awk '{print $1}' 1.log |sort -n|uniq -c
命令补充
awk 命令
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。相对于grep的查找
AWK 在其对数据分析并生成报告时,显得尤为强大。简单来说,awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分在做分析处理。
awk '{pattern + action}' {filenames}
调用awk
1.命令行方式
awk [-F field-separator] 'commands' input-file(s)
commands 是真正的awk命令
[-F 域分隔符]是可选的。
input-file(s)是待处理的文件
在awk中,文件的每一行中,由域分隔符分开的每一项为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
2.shell脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
相当于shell脚本首行的:#!/bin/sh
可以换成:#!/bin/awk
3.将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file(s)
其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
基本用法:
awk 动作 文件名
#示例
[root@localhost ]# awk '{pring $0}' demo.txt
说明:demo.txt 是awk所要处理的文本文件。前面的单引号内部有一个大括号,里面就是每一行要处理的动作 ing $0。
其中print 是打印命令。0代表当前行,因此上面命令的执行结果,就是把每一行原样打印出来。
$ echo 'this is a test' | awk '{print $0}'
this is a test
上面代码中,print $0就是把标准输入重新打印一遍。
awk会根据空格和制表符,将每一行分成若干字段,依次用$1、$2、$3代表第一个字段、第二个字段、第三个字段等等。
读取文件:现在有demo.txt如下所示
root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
#按照":"分隔,取第一个
[root@localhost ]# awk -F ':' '{ print $1 }' demo.txt
root
daemon
bin
sys
sync
变量
除了$ +
数字表示某个字段,awk还提供其他一些变量。
变量==NF==表示当前行有多少个字段,因此$NF
就代表最后一个字段。
[root@localhost ]# echo 'this is a test' | awk '{print $NF}'
test
#$(NF-1)代表倒数第二个字段,print命令里面的逗号,表示输出的时候,两个部分之间使用空格分隔,demo.txt是上面的文件
[root@localhost ]# awk -F ':' '{print $1, $(NF-1)}' demo.txt
root /root
daemon /usr/sbin
bin /bin
sys /dev
sync /bin
#变量NR表示当前处理的是第几行,print命令里面,如果原样输出字符,要放在双引号里面。
[root@localhost ]# awk -F ':' '{print NR ") " $1}' demo.txt
1) root
2) daemon
3) bin
4) sys
5) sync
awk的其他内置变量如下。
FILENAME:当前文件名
FS:字段分隔符,默认是空格和制表符。
RS:行分隔符,用于分割每一行,默认是换行符。
OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
OFMT:数字输出的格式,默认为%.6g。
函数
awk还提供了一些内置函数,方便对原始数据的处理。
函数toupper()用于将字符转为大写。
[root@localhost ]# awk -F ':' '{ print toupper($1) }' demo.txt
ROOT
DAEMON
BIN
SYS
SYNC
其他常用函数
tolower():字符转为小写。
length():返回字符串长度。
substr():返回子字符串。
sin():正弦。
cos():余弦。
sqrt():平方根。
rand():随机数。
条件
awk允许指定输出条件,只输出符合条件的行。
输出条件要写在动作的前面。
$ awk '条件 动作' 文件名
案列
#print命令前面是一个正则表达式,只输出包含usr的行
[root@localhost ]# awk -F ':' '/usr/ {print $1}' demo.txt
root
daemon
bin
sys
# 输出奇数行
[root@localhost ]# awk -F ':' 'NR % 2 == 1 {print $1}' demo.txt
root
bin
sync
# 输出第三行以后的行
[root@localhost ]# awk -F ':' 'NR >3 {print $1}' demo.txt
sys
sync
[root@localhost ]# awk -F ':' '$1 == "root" {print $1}' demo.txt
root
[root@localhost ]# awk -F ':' '$1 == "root" || $1 == "bin" {print $1}' demo.txt
root
bin
if语句
awk提供了if结构,用于编写复杂的条件
$ awk -F ':' '{if ($1 > "m") print $1}' demo.txt
root
sys
sync
$ awk -F ':' '{if ($1 > "m") print $1; else print "---"}' demo.txt
root
---
---
sys
sync