Linux 常用指令

一.用户管理

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分区

  1. 最多支持四个主分区
  2. 系统只能安装在主分区
  3. 扩展分区要占一个主分区
  4. MBR最大只支持2TB,但是拥有最好的兼容性

gtp分区

  1. 支持无限多个主分区
  2. 最大支持18EB的大容量(EB=1024PB,PB=1024TB)
  3. 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 中的变量分为,系统变量和用户自定义变量。

系统变量:HOME ,PWD , @SHELL , USER 等等,比如 ```echoHOME```

显示当前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   $变量名       (功能描述:查询环境变量的值)

案列

  1. 在/etc/profile 文件中定义 TOMCAT_HOME 环境变量
TOMCAT_HOME=/opt/tomcat
export TOMCAT_HOME
  1. 查看环境变量TOMCAT_HOME的值
[root@localhost]# source /etc/profile
[root@localhost]# echo $TOMCAT_HOME
/opt/tomcat

  1. 在另外一个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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • Linux指令中文说明传送入口 整理自Linux指令中文说明 man Linux 帮助文档手册 man命令 是L...
    释闲人阅读 1,019评论 0 2
  • 1.帮助:(查看指令的详细信息) 1.1 xxx --help (xxx -h) 1.2 man xxx 2.查看...
    雪上行者_阅读 335评论 0 0
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 4,968评论 0 9
  • linux与本地文件传输,推荐使用Xftp 查看目录下有什么文件ls //list查...
    hello大象阅读 284评论 0 1
  • linux常用指令: 1.文件管理2.目录管理3.用户管理4.权限管理5.文件搜索6.内容搜索7.压缩包管理8.网...
    提莫队长1234阅读 2,796评论 0 5