一、Linux 背景介绍
1.1Liunx版本
内核版本:https://www.kernel.org
内核版本分为三个部分,主版本号、次版本号、末版本号,次版本号是奇数为开发板,偶数为稳定版。
发行版本
RedHat:经过专业测试
Fedora:社区发行,版本较新,但是没有经过专业测试。(也是redhat发行)
CentOS:用RedHat的源代码编译,但是把RedHat的商标等去掉。但是没有一些技术支持。
桌面安装:Debian,Ubuntu
1.2 常见目录介绍
/ 根目录 /root root用户的家目录 /home/username 普通用户的家目录 /etc 配置文件目录 /bin 命令目录 /sbin 管理命令目录 /usr/bin/usr/sbin 系统预装的其他命令
二、系统操作
2.1帮助命令
man 是 manual 的缩写 man 帮助用法演示 #man ls man 也是一条命令,分为9章,可以使用man命令获得man的帮助 #man 7 man help shell(命令解释器)自带的命令成为内部命令,其他的是外部命令 内部命令使用 help 帮助 #help cd 外部命令使用help帮助 #ls --help 可以通过type来判断一个命令是内部还是外部命令 #type ls #type cd
2.2 文件管理
显示当前的目录
pwd 显示当前的目录名称
更改当前的操作目录
cd 更改当前的操作目录 cd /path/to/... 绝对路径 cd ./path/to/... 相对路径 cd ../path/to/... 相对路径
文件查看
ls 查看当前目录下的文件 ls / /root 这样会同时查看根目录和 /root目录下的文件 常用参数 -l 长格式显示文件 -a 显示隐藏文件 -r 逆序显示(默认按照文件名排序) -t 按照时间顺序显示 ls -l -r -t (会按照时间逆向排序) -R 递归显示
-h 人性化显示、
-d 只显示目录
目录文件的创建与删除
mkdir 建立空目录 mkdir a 常用参数 -p 递归创建多级文件夹 rmdir 删除空文件夹 rmdir a rm 可以删除非空目录及文件 常用参数 -r 删除目录 -f 强制删除,不提示 需要注意,rm -rf 后面可以跟多个目录,不要出现 rm -rf / usr 这种,会从根目录开始删除
复制和移动目录
cp 复制文件和目录 cp /root/a /tmp(临时文件) 常用参数 -r/R 递归复制目录 -v 显示过程 -p 保留文件原有更新时间(属性) -a 时间戳+所有权+复制连接文件属性而非档案本身
-f 强行覆盖
-i 覆盖之前先行提示 mv 移动文件或者重命名 mv /a /othera mv /a /tmp mv /a /tmp/b(移动+重命名) 常用参数 -i 覆盖文件前提示
2.3 通配符
定义:shell 内建的符号 用途:操作多个相似(有简单规律的)文件 常用通配符: * 匹配任何字符串 ? 匹配1个字符串 [xyz] 匹配xyz任意一个字符 [a-z] 匹配一个范围 [!xyz]或者[^xyz] 不匹配
2.4 文本内容查看
cat 文本内容显示到终端 显示全部 head 查看文件开头 head test.txt 默认查看前10行 head -5 test.txt tail 查看文件结尾 tail -1000f catalina.out 常用参数 -f 文件内容更新后,显示信息同步更新 wc 统计文件内容信息 wc -l /tmp/test.txt 查看文件有多少行 -c或--bytes或——chars:只显示Bytes数; -l或——lines:只显示列数; -w或——words:只显示字数。 more 分行显示 less
2.5 打包和压缩
最早的Linux备份介质是磁带,使用的命令是tar 可以打包后的磁带文件进行压缩储存,压缩的命令是 gzip 和 bzip2 经常使用的扩展名是 .tar.gz .tar.bz2 .tgz tar 打包命令 常用参数 c 打包 x 解包 f 指定操作类型为文件
v 显示进度
P 使用绝对路径 打包 tar cf /tmp/etc-backup.tar /etc 把 /etc 这个文件夹打包放在/tmp/etc-backup.tar
会提示,但是也能成功:tar: Removing leading `/' from member names
tar cPf /tmp/etc-backup.tar /etc 使用绝对路径 (没有提示)
tar czf /tmp/etc-backup.tar.gz /etc (tar集成了gzip和bzip2) tar cjf /tmp/etc-backup.tar.bz2 /etc (压缩比例更高)
解包 tar xf /tmp/etc-backup.tar -C /root 把 tar包解压到 /root 目录下 tar zxf /tmp/etc-backup.tar.gz -C /etc tar zjf /tmp/etc-backup.tar.gz -C /etc
2.6 vi(现在一般都是默认vim)
多模式产生的原因 四种模式: 正常模式(Normal-mode) 插入模式(Insert-mode) 命令模式(Command-mode) 可视模式(Visual-mode) i 进入插入模式 i是当前光标 I是光标当行开头 a是光标后一位 A是光标当行结尾 o下一行,会产生一个空行 O上一行,会产生一个空行 v进入可视模式 :进入命令模式 esc返回正常模式 正常模式下: hjkl可以控制上下左右 yy表示复制当行,p可以粘贴 3yy表示复制三行 y$ 表示复制从光标到当行结尾 dd d$表示剪切 操作错误,u可以撤销,ctrl+r重做 x表示删除当前光标的字符 r可以替换当前字符 :set nu 可以查看目前是第几行 数字 + G可以到数字对应的行 g移动到第一行 G移动到最后一行 ^来到光标所在行的开头,$来到光标所在行的结尾 命令模式 :w /root/test.txt 文件新建的,可以保存一个新文件 :w 文件已经存在的情况下,保存 :wq 保存退出 :q! 强制退出 :! 执行linux命令,看完后回车重新回到vim /x 查找x字符,n查找下一个,shift+n上一个 :s/old/new 用新字符替换旧字符(只正对光标所在的行) :%s/old/new 用新字符替换旧字符(整个文本,但只替换一个) :%s/old/new/g 用新字符替换旧字符(整个文本,全部替换) :3,5s/x/X/g 3-5行内全部替换,替换一个就去掉g :set nu 显示行号 :set nonu 不显示行号 以上是单次修改的,如果要修改默认配置 vim /etc/vimrc 可视模式 三种进入可视模式的方式 v 字符可视模式 V 行可视模式 ctrl + v 块可视模式 配合d和I(大写i)命令可以进行块的便利操作 需要在块的所有行之前加入一些字符,选中块,I的时候会在选中的块的第一行的第一个光标处,输入字符,连续两次esc。 选中块,d,然后选中的块就会被删除
2.7 用户与权限管理
useradd 新建用户 useradd dongye(可以用 id dongye 来验证是否存在) 创建一个用户后,自动在 /home建立家目录,并且创建一些隐藏文件。同时,在 /etc/passwd 这个文件里会加入新用户dongye的数据,/etc/shadow里面也有会相关数据(密码相关)。如果没有组的话,创建一个同名的组。 userdel 删除用户 userdel dongye userdel -r dongye 同时删除家目录 passwd 修改用户密码 passwd dongye passwd更改当前用户密码 /etc/passwd 和 /etc/shadow 里面的数据也被删除 usermod 修改一个用户账户 usermod -d /home/other dongye 家目录从 /home/dongye 改成 /home/other chage 修改用户生命周期
设置用户密码的过期时间,甚至用户本身的过期时间
2.8 组管理命令
groupadd 新建用户组 groupadd group1 useradd user1 usermod -g group1 user1 把user1这个用户的组改成group1 useradd -g group1 user2 新建用户user2时就把它放到group1组下 groupdel 删除用户组
groupdel group1 删除组group1
2.9 用户切换
su 切换用户 su - USERNAME 使用 login shell 方式切换用户 su USERNAME 不完全切换,比如还是在 /root下而不会自动跳转到用户家目录 sudo 以其他用户身份执行命令 visudo 设置需要使用sudo的用户(组)。下图设置 user3用户拥有shutdown -c权限,需要输入 user3自己的密码
2.10 用户和用户组的配置文件介绍
/etc/passwd 用户配置文件,7个字段 user3:x:1003:1003::/home/user3:bin/bash user3:用户名称 x:是否需要密码验证,x表示需要,空表示不需要 1003:用户的uid,用户的id信息,唯一识别用户的标识。root是0。 1003:用户的gid,表示组id信息 第五个字段:注释 /home/user3:家目录 /bin/bash:用户登录后的命令解释器。/sbin/nologin 表示不能登录 /etc/shadow 保存用户和用户密码相关信息的 第一个字段:用户名称 第二个字段:用户加密过后的密码(看到也没用,经过处理,即使相同的密码也会显示不同) /etc/group 用户组相关的配置文件,4个字段 group:x:10:another group:组的名称 x:是否需要密码验证 10:gid another:其他组设置,说明another这个用户的第二个组是group
比如输入 id user1
uid=1001(user1) gid=1001(group1) 组=1001(group1)
id another
uid=1002(another) gid=1002(another) 组=1003(group) 查找another信息,发现他的第二个组是group
2.11 文件与目录权限表示方法
文件类型 - 普通文件 d 目录文件 b 块特殊文件 c 字符特殊文件 l 符号链接 f 命名管道 s 套接字文件 文件权限的表示方法 字符权限表示方法 r 读 w 写 x 执行 数字权限的表示方法 r=4 w=2 x=1 文件权限的表示方法 rwxrwxrwx 第一个表示文件属主的权限,第二个表示文件属组的权限,第三个表示其他用户的权限 创建新文件有默认权限,根据umask值计算,属主和属组根据当前进程的用户来设定 目录权限的标识方法 x 进入目录 rx 显示目录内的文件名 wx 修改目录内的文件名
2.12 文件权限的修改方法和数字表示方法
修改权限命令(测试的时候别用root,root不受限制) chmod 修改文件、目录权限 chmod u+x /tmp/testfile u表示属主 chmod u=rwx /tmp/testfile chmod g-r /tmp/testfile g表示属组 chmod 0-r /tmp/testfile o表示其他用户 chmod a+r /tmp/testfile a表示所有 chmod 755 /tmp/testfile
如果属主没有权限,所属的组有权限,以属主为准,还是没有权限。 chown 更改属主、属组 chown user1 /test 把test这个目录的属主改成user1 chown :group /test 把test这个目录的属组给成group
chown user1:group /test 一起修改 chgrp 可以单独更改属组、不常用 linux一般创建一个文件默认会赋予666权限,然后根据用的umask值来计算。 用户默认umask值为022,所以一般是 666-022=644,对应rw-r--r--
2.13 特殊权限
SUID 用于二进制可执行文件,执行命令时取得文件属主权限 如,/usr/bin/passwd SGID 用于目录,在该目录下创建新的文件和目录,权限自动更改为该目录的属组 文件共享时使用 SBIT 用于目录,该目录下新建的文件和目录,仅root和自己可以删除 如 /tmp
三、网络管理
3.1 网络状态查看
net-tools VS iproute 1. net-tools ifconfig route netstat 2. iproute2 ip ss
网卡名称
ifconfig查看网卡名称 · eth0 第一块网卡(网络接口) · 你的第一个网络接口可能叫做下面的名字 · eno1 板载网卡 · ens33 PCI-E网卡 · enp0s3 无法获取物理信息的 PCI-E 网卡 · CentOS7使用了一致性网络设备命名,以上都不匹配则使用eth0 当工作中大量管理网卡,所有设备的网卡最好都是以 eth0 命名,这样可以批量操作。 网络接口命名修改 网卡命名规则受 biosdevname 和 net.ifnames 两个参数影响 编辑 /etc/default/grup 文件,增加 biosdevname=0 net.ifnames=0 更新 grub # grub2-mkconfig -o /boot/grub2/grub.cfg 重启 # reboot 组合,biosdevname=0 net.ifnames=0,则网卡名为 eth0 biosdevname=1 net.ifnames=0,则网卡名为 em1 biosdevname=0 net.ifnames=1,则网卡名为 ens33
ifconfig
普通用户要使用ifconfig,要使用 /sbin/ifconfig 如果只想要看某一张网卡,可以 ifconfig 网卡名 mii-tool eth0 查看网卡物理连接情况 route -n 查看网关(路由),使用 -n 参数不解析主机名(把ip解析成域名)
网络配置命令
ifconfig <接口> <IP地址> [netmask 子网掩码] 设置网卡的ip地址 ifup <接口> 启用网卡 ifdown <接口> 禁用网卡
网关配置命令
添加网关 route add default gw <网关ip> route add -host <指定ip> gw <网关ip> route add -net <指定网段> netmask <子网掩码> gw <网关ip>
网络命令集合:ip命令
略过
3.2 网络故障排除
ping 检测是否连接到主机 ping www.baidu.com traceroute 跟踪当前主机到目标主机的网络状态,-w 1超时最多等1秒 traceroute -w 1 www.baidu.com mtr 显示自己主机的网络状态 nslookup 域名解析成ip nslooup www.baidu.com telnet 检测端口 telnet www.baidu.com 80 tcdump 网络抓包 -i any 抓取所有网卡里的数据包,-n 把域名解析成 ip ,port 80 抓取指定端口 host 10.0.0.1 抓取当前主机到某个主机的数据包 tcpdump -i any -n port 80 tcpdump -i any -n host 10.0.0.1 tcpdump -i any -n host 10.0.0.1 and port 80 tcpdump -i any -n host 10.0.0.1 and port 80 -w /tmp/filename 捕获并且保存 netstat 监听地址 -n 域名转换,-t 显示tcp ,-p 进程 ,-l tcp状态 listen netstat -ntpl ss 跟netstat一样,参数也一样,显示的格式不一样
网络管理和配置文件
网络服务管理程序分为两种,分别是 SysV 和 systemd(centos7) service network status|start|stop|restart 网络配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0 (网卡配置项) /etc/hosts
四、软件包管理
4.1 软件包管理器
包管理器是方便软件安装、卸载,解决软件依赖关系的重要工具。
- CentOS 和 RedHat 使用 yum 包管理器,软件安装包格式为 rpm。
- Debian、Ubuntu使用 apt 包管理器,软件安装包格式为 deb
4.2 使用rpm命令安装软件包
rpm 命令常用参数 -q 查询软件包
rpm -qa 查询所有软件包
rpm -q vim-common 查询某个软件包
-i 安装软件包
rpm -i vim-enhanced-7.4.160-5.el7.x84_64.rpm (要全称) -e 卸载软件包
rpm -e vim-enhanced (只要名字,不需要版本号等)
用 rpm 安装的问题:如果一个软件包依赖其他软件包,那么就会安装失败。需要操作者自己解决依赖关系。
4.3 使用yum包管理器安装软件包
rpm 包的问题
- 需要自己解决依赖关系
- 软件包来源不可靠
CentOS yum源 http://mirror.centos.org/centos/7/ 国内镜像 https://opsx.alibaba.com/mirror yum 配置文件 /etc/yum.repos.d/CentOS-Base.repo 可以修改配置文件 [base] name=CentOS-$releasever - Base -mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/ http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/ http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 或者直接用别人已经写好的配置文件 wget -O /etc/yum.repo.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
需要清除缓存
yum makecache
yum 命令常用选项
常用选项 install 安装软件包 remove 卸载软件包 list |grouplist 查看软件包 update 升级软件包
4.4 其他方式安装
二进制安装 源代码编译安装 wget https://openresty.org/download/openresty-1.15.8.1.tar.gz tar zxf openresty-VERSION.tar.gz cd openresty-VERSION/ ./configure --prefix=/usr/local/openresty make -j2 (用2核编译) make isntall
4.5 升级内核
rpm 格式内核 查看内核版本 uname -r 升级内核版本 yum install kernel-3.10.0 这种方式一般不能升级到最新 epel软件仓库会有较高的软件版本。yum install epel-release -y 升级已安装的其他软件包和补丁 yum update 除了升级内核,还会升级软件包。正常不要使用。 源代码编译安装内核 yum install gcc gcc-c++ make ncurses-devel openssl-devel elfutils-libelf-devel 下载并解压缩内核 https://www.kernel.org tar xvf linux-5.1.10.tar.xz -C /usr/src/kernels 配置内核编译参数 cd /usr/src/kernels/linux-5.1.10/ make menuconfig | allyesconfig | allnoconfig make allyesconfig (无脑全选) 使用当前系统内核配置 cp /boot/config-kernelversion.platform /usr/src/kernels/linux-5.1.10/.config 查看cpu lscpu 编译 make j2 all 安装内核 make modules_install make install
五、进程管理
5.1 进程的概念与进程查看
进程-运行中的程序,从程序开始运行到终止的整个生命周期是可管理的 查看命令 ps -e 表示所有的终端运行的进程 -f 显示更多信息,比如 UID、PPID(父进程)、CMD(命令的完整路径) -L 多显示 LWP ,线程信息 ps -eLf 常用命令 pstree 查看进程树 top 动态查看进程信息
top -p 进程号 结论: 进程也是树形结构 进程和权限有着密不可分的关系
top
第一行 34min 表示这台机器已经启动34分钟没有关机了 2users 表示有2个用户登录 平均负载:1分钟,5分钟,15分钟 第二行 一共运行的任务,几个在running ,几个在sleeping 第三行(平均值,按 1 会把所有 逻辑cpu 的使用情况列出来) 2.8 us 1.8 sy 97.7 id 0.0 wa us 表示用户计算,sy表示进程之间状态交互,id表示空闲,wa表示磁盘等待 第四行 内存状态 第五行 交换分区(虚拟内存)
进程的优先级调整
调整优先级 nice 范围从 -20 到 19,值越小优先级越高,抢占资源就越多 nice -n 10 ./rest.sh 启动的时候调整为 10 renice 重新设置优先级 renice -n 15 19312 已经处于启动的情况下进行调整。根据进程号 进程的作业控制 &符号,后台运行 ./test.sh & jobs 把处于后台运行的程序调到前台显示 jobs 能得到一个编号 fg 编号,可以调到前台 ctrl +z,把已经处于前台的程序调到后台,状态会stop
5.2 进程的通信方式-信号
信号是进程间通信方式之一,典型用法是:终端用户输入中断命令,通过信号机制停止一个程序的运行。 使用信号的常用快捷键和命令 kill -l 查看所有的信号 SIGINT 通知前台进程组终止进程 ctrl + c,2号信号 SIGKILL 立即结束程序,不能被阻塞和处理 kill -9 pid ,9号信号
5.3 守护进程和系统日志
守护进程(精灵进程) 使用 nohup 与 & 符号配合运行一个命令 (nohup进程不是守护进程) nohup 命令使进程忽略 hangup(挂起)信号。关掉终端这个进程依然可以运行,忽略输入并且把输出打印到 nohup.out
守护进程(daemon)和一般进程有什么差别呢? 开机自启,守护进程不需要终端,输出可以打印到特殊的文件中,进程所占用的目录是根目录。
cd /proc/ 这个目录是内存信息,相应的进程会有进程号同名的目录。 使用 screen 命令,进入screen环境后,如果远程连接断掉了,可以通过screen恢复工作现场 screen 进入 screen 环境 ctrl +a然后再单独按d退出(detached)screen 环境 screen -ls 查看 screen 的会话 screen -r sessionid 恢复会话
系统日志文件 /var/log
系统常规日志:messages
内核运行情况:dmesg
安全日志 secure
定时任务日志 cron
5.4 服务管理工具 systermctl
服务(提供常见功能的守护进程)集中管理工具
- service
- systemctl(centos7以后的,可以看做service进化版)
service 启动脚本 cd /etc/init.d/ 目录下 vim network 可以查看network的启动脚本,200多行,完全由编写人员自己控制,比较复杂; systemctl 启动脚本 cd /usr/lib/systemd/system/ vim sshd.service 原有的init,linux的1号进程 init 0 关机 (不能用kill -9杀掉这个进程,只能0结束这个进程,进而关机) init 6 重启 init 3 字符终端 init 5 图形界面 systemctl 常见操作 systemctl status|start|stop|restart|reload|enable|disable 服务名称 1、restart 和reload差别,reload不停服务,直接重启 2、enable开机启动,disable不开机启动
5.5 SELinux 简介
MAC(强制访问控制)和DAC(自主访问控制)。SELinux就是 MAC,生产环境不太用,比较麻烦。
---
根据进程pid查端口 lsof -i |grep pid 根据端口port查进程 lsof -i:port 根据进程pid查端口 netstat -nap |grep pid 根据端口port查进程 netstat -nap |grep port
六、内存和磁盘管理
6.1 内存和磁盘使用率查看
内存使用率查看 free -m 以兆的方式显示 -g 以G的方式显示,但是会被四舍五入。一般不用 top 磁盘使用率的查看 fdisk -l 查看 磁盘分区一块硬盘最多分15个分区 df 既能够看到分区,又能够看到挂载到的目录 -h 人性化可读 du (实际占用的空间) -h 人性化显示 -s 只显示总计 du与ls的区别 du 是实际占用的,ls算上空洞数据。
6.2 常见文件系统
Linux 支持多种文件系统,常见的有
ext4(centos6)
xfs(centos7)
NTFS(需安装额外软件,window常用,有版权)
6.2.1 ext4文件系统
ext4文件系统基本结构比较复杂
超级块
超级块副本
i节点(inode)
数据块(datablock)
6.3 磁盘分区和挂载
常用命令 fdisk mkfs parted mount 常见配置文件 /etc/fstab 用fdisk创建分区(一个硬盘设备可以创建多个分区,也可以创建一个) 1:fdisk -l 查看有几个硬盘设备及分区 2:fdisk /dev/sdc (比如有设备sdc,则可以针对sdc进行分区) 3:之后 m 键是帮助 4:n 表示新建一个分区 5:新建分区时,需要选择主分区和扩展分区,其中 p表示主分区,最多有4个。e表示扩展分区(里面可以建立逻辑分区)。一般把一块硬盘划分为一个主分区。使用扩展分区时,只能建立3个主分区。 6:选择区分编号1-4 7:指定分区扇区大小,默认2048 8:指定分区大小。默认全部。可以 + 20G等可以选择分区大小 9:q 表示退出,分区不生效。w 表示生效 建立完分区后,需要对分区进行格式化。 mkfs.ext4 mkfs.xfs等命令 mkfs.ext4 /dev/sdc1 然后要进行操作,linux里都是文件级别的操作,需要挂载到某个目录下 mkdir /mnt/sdc1 mount /dev/sdc1 /mnt/sdc1 挂载上去 对/mnt/sdc1的读写就会落入sdc1设备上 1、一个硬盘 2、进行分区 3、格式化 4、挂载 5、对指定目录进行操作 需要注意的事情: 如果一个硬盘大于 2T ,不能使用 fdisk 进行分区,需要使用 parted parted /dev/sdd help 获取帮助 mount 进行挂载是临时的,不是固化的 vim /etc/fstab 在文件中新增下面一句话 /dev/sdc1 /mnt/sdc1 ext4 defaults(表示权限)0 0
6.4 系统综合状态查询
使用 sar 命令查看系统综合状态 sar -u 1 10 CPU的查看,每隔1秒做采样,采样10次, sar -r 1 10 看内存 sar -b 1 10 IO的情况(磁盘读写) sar -d 1 10 查看每块磁盘的读写 sar -q 1 10 查看进程 使用第三方命令查看网络流量 yum install epel-release yum install iftop (网络情况) iftop -p (默认eth0)
七、shell
7.1 什么是Shell
shell 是命令解释器,用于解释用户对操作系统的操作。 shell有很多 cat /etc/shells CentOS 7 默认使用的shell是bash
7.2 Shell 脚本
UNIX的哲学:一条命令只做一件事情 为了组合命令和多次执行命令,使用脚本文件来保存需要执行的命令 赋予该文件执行权限(chmod u+rx filename)
标准的Shell脚本要包含哪些元素
Sha-Bang 命令 “#”号开头的注释 chmod u+x filename 可执行权限 执行命令 bash ./filename.sh 会生成一个子进程(不需要执行权限) ./filename.sh 会生成一个子进程,使用Sha-Bang (需要可执行权限) source ./filename.sh 在当前进程运行 . filename.sh (点之后会产生一个子进程) 比如一个脚本如下: #! /bin/bash cd /tmp 在/home目录下运行 bash ./filename.sh 运行,子进程运行cd,然后子进程结束,此时pwd,还是在 /home 而不是/tmp source ./filename.sh 或者 . filename.sh 内建命令和外部命令的区别 内建命令不需要创建子进程,内建命令比如source 内建命令对当前shell生效
7.3 管道与重定向
7.3.1 管道与管道符
管道和信号一样,也是进程通信的方式之一 匿名管道(管道符)是 Shell 变成经常用到的通信工具 管道符是“|”,将前一个命令执行的结果传递给后面的命令 ps | cat echo 123 | ps
echo 123 |cat |cmd 可以连续使用
可以看到 cat 和 ps 是两个进程,两个进程之间的通信被连接起来。
重定向符号
一个进程默认会打开标准输入、标准输出、错误输出三个文件描述符 输入重定向符号 “<” read var < /path/to/a/file 输出重定向符号 ">" ">>" "2>" "&>" echo 123 > /path/to/a/file 清空再输入 echo 123 >> /path/to/a/file 追加 2> 命令执行过程中有错误则重定向 &> 命令执行过程中无论正确错误都重定向 输入和输出重定向组合使用 cat > /path/to/a/file.sh << EOF i am $USER EOF 运行以上三句话,会生成一个file.sh文件,文件里内容为i am $USER
7.4 变量
7.4.1 变量的赋值
变量名的命名规则 字母、数字、下划线 不以数字开头 变量的赋值 为变量赋值的过程中,称为变量替换 变量名=变量值 a=123 (不允许出现空格,shell会认为前面不是变量名而是一个命令,比如reboot =1),会重启 使用let为变量赋值 let a=10+20 (尽量少用,效率很低) 将命令赋值给变量 l=ls (用处不大) 将命令结果赋值给变量,使用$() 或者 '' letc=$(ls -l /etc) letc=$'ls /root' 变量值有空格等特殊字符可以包含在 "" 或 '' 中 srring1='hello bash' string2="hello I'm name"
7.4.2变量引用及作用范围
变量的引用 ${变量名}称作对变量的引用 echo ${变量名} 查看变量的值 ${变量名} 在部分情况下可以省略为 $变量名 变量的作用范围 变量的默认作用范围 当前的shell,父进程的变量对子进程无效,子进程的对父进程也无效。 可以使用source 变量的导出 export ,子进程可以获得父进程的变量 export demo_var1="hello subshell" 变量的删除 unset unset demo_var1
7.4.3 系统环境变量、预定义变量与位置变量
环境变量:每个Shell打开都可以获得到的变量 set 和 env 命令 env | more 查看当前所有的环境变量 echo ${HOME} 查看单个环境变量 $PATH 当前命令的搜索路径 所以要在$PATH 中新增路径,使用PATH=$PATH:新加路径(只对当前终端生效,对子shell生效) $PS1 当前提示终端 预定义变量 echo $? $$ $0等 $? 指上一条命令是否正确执行,echo $?,正确执行返回0,错误1 $$ 显示当前进程 PID $0 显示当前进程名称 位置变量 $1 $2 ... ${10},需要有{} 比如有脚本 test.sh]如下: #! /bin/bash pos1=$1 pos2=$2 echo $pos1 echo $pos2 执行的时候,./test.sh -a -l 会传参进去,可以对脚本进行简化 echo $1 echo $2 考虑到echo $2 的时候 $2 有可能是空值。所以写成下面这样 pos1=$1 pos2=${2}_ echo $pos1 echo $pos2 如果没有传参,则$2默认为_,规避读入的值是空值。但是这么写,如果传参进去,后面会多一个_,所以可以改成下面这样: pos2=${2-_}
7.4.4 环境变量配置文件
配置文件 /etc/profile /etc/profile.d/ ~/.bash_profile ~/.bashrc /etc/bashrc 所以经常在 /etc/profile 中新增 export PATH=$PATH:/new/path su - 切换用户会加载4个文件 su 切换用户只会加载~/.bashrc、/etc/bashrc
7.5 数组
定义数组 IPTS=(10.0.0.1 10.0.0.2 10.0.0.3) 显示数组的所有元素 echo ${IPTS[@]} 显示数组元素个数 echo ${#IPTS[@]} 显示数组的第一个元素 echo ${IPTS[0]}
7.6 转义和引用
特殊字符:一个字符不仅有字面意义,还有元意(meta-meaning) # 注释 ; 分号 转义符号 " 和 ' 引号 单个字符的转义 单个字母的转义 $ " \ 单个非字母的转义 引用 "" 双引号,如果里面有变量,会进行解释 '' 单引号不会进行解释 ` 反引号
7.7 运算符
赋值运算符 = 赋值运算符,用于算数赋值和字符串赋值 使用 unset 取消为变量的赋值 = 除了作为赋值运算符还可以作为测试操作符 算数运算符 基本运算符 + - * / ** % 使用expr进行计算 expr 4 + 5 (要有空格,只能支持整数) num1=`expr 4 + 5` 数字常量的使用方法,如果不用特殊方法,a=4+5,其实把 “4+5”字符串赋值给a let “变量名=变量值” 变量值使用0开头为八进制,0x开头为十六进制 双圆括号是let命令的简化 ((a=4+5)) ((a++)) echo $((10+20))
7.8 特殊字符大全
引号 ' 完全引用 " 不完全引用 ` 执行命令 括号 () (()) $() 圆括号 单独使用圆括号会产生一个子shell(xyz=123) 数组初始化 IPS=(ip1 ip2 ip3) [] [[]] 方括号 单独使用方括号是测试(test)或数组元素功能 两个方括号表示测试表达式 <> 尖括号 重定向符号 {} 花括号 输出范围 echo{0..9},会输出0-9所有数字 文件复制 cp -v /etc/passwd /etc/passwd.bak 等同于 cp -v /etc/passwd{,.bak} 运算和逻辑符号 +-*/% 算数运算符 ><= 比较运算符 && || !逻辑运算符 (( 5 > 4 && 6> 5)),然后通过 echo $? 判断 转义符号 其他符号 # 注释符 ; 命令分隔符 case 语句的分隔符要转义 ;; :空指令 . 和source命令相同 ~ 家目录 , 分隔目录 * 通配符 ? 条件测试或通配符 $ 取值符号 | 管道符 & 后台运行 空格
7.9 测试与判断
退出程序命令 exit 判断上一条命令是否正常,0或者非0 exit 1或者0 返回10 给shell ,返回值非0位不正常退出 $? 判断当前shell前一个进程是否正常退出 测试命令test test命令用于检查文件或者比较值 test可以做以下测试 文件测试 整数比较测试 字符串测试 test测试语句可以简化为[]符号 test -f /etc/passwd2 判断文件是否存在并且是个普通文件,-e是文件或者目录,-d目录 [ -d /etc/ ] []符号还有扩展写法 [[]] 支持 && || < >
if判断语句
if-then 语句的基本用法 if [ 测试条件成立 ] 或 命令返回值是否为0 then 执行相应命令 fi 结束 if-then-else 语句可以在条件不成立时也运行相应的命令 if [ 测试条件成立 ] then 执行相应命令 else 测试条件不成立,执行相应命令 fi 结束 if [ 测试条件成立 ] then 执行相应命令 elif [ 测试条件成立 ] then 执行相应命令 else 测试条件不成立,执行相应命令 fi 结束 嵌套 if 的使用 if 条件测试中可以再嵌套 if 条件测试 if [ 测试条件成立 ] then 执行相应命令 if [测试条件成立] then 执行相应命令 fi fi
7.10 case 分支
case 语句和 select 语句可以构成分支 case "$变量" in "情况1" ) 命令...;;; "情况2" ) 命令...;;; * ) 命令...;;; esac
7.11 循环
7.11.1 for循环
for 循环的语法 for 参数 in 列表 do 执行的命令 done 封闭一个循环 使用反引号或 $() 方式执行命令,命令的结果当做列表进行处理 列表中包含多个变量,变量用空格分隔 for i in {0..9} for filename in 'ls *.mp3' 对文本处理,要使用文本查看命令取出文本内容 默认逐行处理,如果文本出现空格会当做多行处理 C 语言风格的 for 命令 for((变量的初始化;循环判断条件;变量变化)) do 命令 done
7.11.2 while循环
while test测试是否成立 do 命令 done until 循环 与while 循环相反,循环测试为假时,执行循环,为真实循环停止
7.11.3 break 和 countine
break 退出
continue 结束本轮循环
7.11.4 使用循环处理位置参数
命令行参数可以使用 $1 $2 ... ${10}..$n 进行读取 $0 代表脚本名称 $* 和 $@ 代表所有位置参数 $# 代表位置参数的数量 有脚本test.sh如下: #! /bin/bash # help display help help for pos in $* do if [ "$pos" = "help"]; then echo $pos $pos fi done 运行语句: bash test.sh a b c help while 脚本如下: #! /bin/bash while [ $# -ge 1] do if [ "$1" = "help" ]; then echo $1 $1 fi shift done shift能够参数左移 运行语句: bash test.sh a b c help
7.12 函数
7.12.1 自定义函数
函数用于“包含”重复使用的命令集合 自定义函数 function fname(){ 命令 } 函数的执行 fname 函数作用范围的变量 local 变量名 函数的参数 $1 $2...$n checkpid() { local i for i in $* ; do [ -d "/proc/$i" ] && return 0 done return 1 } 执行时 checkpid 1 或者 checkpid 1 2 echo $?
7.12.2 系统脚本
系统自建了函数库,可以在脚本中引用 /etc/init.d/functions 自建函数库 使用 source 函数脚本文件“导入”函数 source /etc/init.d/functions echo_success
7.13 脚本优先级控制
可以使用 nice 和 renice 调整脚本优先级 避免出现“不可控的”死循环 死循环导致cpu占用过高 死循环导致死机 ulimit -a 可以查看当前终端的使用限制,root用户的话有些限制不会生效 max user processes 用户的最大进程数
7.14 计划任务
7.14.1 一次性计划任务 at
at 18:31 at > echo hello > /tm[/test.txt at> 然后ctrl +d 提交
7.14.2 周期性计划任务
cron 配置方式 crontab -e 查看现有的计划任务 crontab -l 配置格式 分钟,小时,日期,月份,星期,执行的命令 注意命令的路径问题 日志(可以查看计划任务有没有被执行) /var/log/cron 每个用户都有自己的计划任务目录 /var/spool/cron/用户
7.14.3 计划任务加锁
如果计算机不能按照预期时间运行
anacontab 延时计划任务
flock 锁文件
7.15 正则表达式与文本搜索
元字符 . 匹配除换行符外的任意单个字符 * 匹配任意一个跟在它前面的字符 [] 匹配方括号中的字符类中的任意一个 ^ 匹配开头 $ 匹配结尾 转义后面的特殊字符 扩展元字符 + 匹配前面的正则表达式至少出现一次 ? 匹配前面的正则表达式出现零次或一次 | 匹配它前面或后面的正则表达式 grep 搜索 grep test /root/test.txt
7.16 搜索文件
cd /etc find passwd -regex 区分大小写 -iregex 不区分大小写 find /etc -regex .*wd find * txt -exec rm -v {} ;
7.17 sed和awk 行编辑器
7.17.1 sed基本用法
sed 一般用于对文本内容做替换 sed '/user1/s/user1/u1' /etc/passwd awk 基本用法 awk 一般用于对文本内容进行统计,按需要的格式进行输出 cut 命令:cut -d:-f 1/etc/passwd awk 命令:awk -F: '/wd$/{print$1}' /etc/passwd
sz 下载
从Linux下载文件到本机 , 在Linux终端输入命令回车后,选择本地存储路径即可。
命令格式: sz filename 下载文件filename
sz file1 file2 下载多个文件
sz dir/* 下载dir目录下所有文件
rz 上传
从本地上传文件到Linux,在Linux终端输入命令回车后,选择本地要上传的文件即可,可一次指定多个文件
命令格式: rz