Linux基础篇 Week 3

Linux基础篇  Week 3


1. Linux文件系统管理
从“/”开始,一切皆文件!
Windows中要搜索文件,如何实现?
Linux中要搜索文件,如何实现?
Linux系统中的一切文件都是从“根(/)目录开始的,并按照文件系统层次化采用树形结构来存放文件
目录说明
目录名 描述
/ Linux的起始点
/bin 二进制可执行文件(常用命令,用户使用的命令)
/sbin 像/bin,/sbin同样也包含二进制可执行文件( 通常由系统管理员使用命令)
/etc 所有程序所需的配置文件
/dev 设备文件( 终端设备、USB、光盘等连接到系统的任何设备)
/proc 系统进程的相关信息( 虚拟的文件系统,包含有关正在运行的进程的信息)
/var 变量文件( 内容可能增长的文件)
/tmp 临时文件,系统和用户创建的临时文件
/usr 用户程序( 包含二进制文件、库文件、文档和二级程序的源代码)
/home 用户目录
/boot 引导加载程序相关的文件
/lib 系统库文件(支持位于/bin和/sbin下的二进制文件的库文件)ld* lib* so*
/opt 附加应用程序
/mnt 挂载目录
/media 可移动设备
/srv 服务数据( 服务器特定服务相关的数据)
/lost+found 文件系统发生错误时,将一些丢失的文件片段存放在这里
符号 作用
. 表示用户所处的当前目录
.. 表示上级目录
~ 表示当前用户自己的家目录
路径说明:如何定位到某个文件
绝对路径(absolute path),从/开始的
相对路径(relative path),不从/开始的
路径的特殊符号
2. Linux磁盘管理
设备 文件名称
IDE设备 /dev/hd[a-d]
SCSI/SATA/U

/dev/sd[a-p]
由于现在的IDE设备已经很少见了,所以一般的硬盘设备都会是以/dev/sd开头。一台
主机可有多块硬盘,从a-p表现。主分区或扩展分区编号从1开始到4线束;逻辑分区
从5号开始
软驱 /dev/fd[0-1]
打印机 /dev/lp[0-15]
光驱 /dev/cdrom
磁带机 /dev/st0或/dev/ht0
文件
系统
说明
Ext3
日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与
错误。最早是从Ext2开始的
Ext4
Ext3的改进版本,作为Centos 6系统中的默认文件管理系统,它支持的存储容量高达
1EB(1EB=1,073,741,824GB),且能够有无限多的子目录
Xfs
高性能的日志文件系统,而且是Centos 7中默认的文件管理系统,优势在发生意外宕机后尤
其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存
储性能。并且它最大可支持的存储容量为18EB,满足了所有需求
  不用刻意去记,知道有几种类型就好
硬盘--->分区--->格式化文件系统--->挂载--->正常访问!
常见的硬件设备
/dev/sda3 #硬件设备所在目录/,sd表示设备类型,a表示硬盘的顺序,3分区的顺序号
Linux主分区或扩展分区的编号从1开始,到4结束;逻辑分区从编号5开始
文件系统
用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成 的
文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。Linux系统支持数十种的文件系统,而最常见
的文件系统如下
挂载硬件设备
mount 命令用于挂载文件系统,把硬盘设备或分区与一个目录文件进行关联,然后就能在这个目录中看到硬
件设备中的数据了
字段 意义
设备文件 一般为设备的路径+设备名称, 也可以写唯一识别码UUID
挂载目录 指定要挂载到的目录,需在挂载前创建好
格式类型 指定文件系统的格式,比如Ext3、Ext4、XFS、SWAP、iso9660等
权限选项 默认为defaults,权限为:rw, suid, dev, exec, auto, nouser, async
是否备份 若为1则开机后使用dump进行磁盘备份,为0则不备份
是否自检 若为1则开机后自动进行磁盘自检,为0则不自检
mount -a #挂载所有在/etc/fstab中定义的文件系统
mount -t #指定文件系统类型
mount /dev/sr0 /mnt
umount /mnt #umount卸载文件系统
more /etc/fstab #文件系统静态信息的文件,以下是文件格式说明
样例:
交换分区Swap
SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间,然后将把内存中暂时不常用的数据临时存放到
硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不
足的问题 但由于交换分区毕竟是通过硬盘设备读写数据的,速度肯定要比物理内存慢,所以只有当真实的物
理内存耗 尽后才会调用交换分区的资源
磁盘相关命令:
free #用于检测内存使用情况
free -h
du #disk usage,用于检测磁盘目录使用情况
du -sh
df #disk free,用于检测空间大小的信息
df -Th
more /etc/fstab
/dev/mapper/centos-root / xfs defaults 0 0
UUID=53b31079-d790-43af-a47d-2be3c363370d /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
如何把光盘自动挂载到/mnt目录下?
vi /etc/fstab
/dev/sr0 /mnt iso9660 defaults 0 0
dumpe2fs #用于检测ext2/ext3/ext4文件系统信息
blkid #用于显示挂载目录及UUID信息
lsblk #用于显示系统下所有磁盘与分区信息
parted #用于显示分区表类型与信息
parted /dev/sda print #用于显示/dev/sda 磁盘的相关数据
fdisk #磁盘分区工具
partprobe #用于更新Linux 核心的分区表信息
partprobe -s
mkfs #格式化工具,这是一个综合命令
mkfs.xfs /dev/sda2 #以xfs文件系统格式化
msfs.ext4 /dev/sda2 #以ext4文件系统格式化
xfs_repair #处理修复xfs文件系统
fsck.ext4 #处理修复ext文件系统
mkswap /dev/sda2 #创建swap分区
练习:
3. Raid管理、madam创建软Raid
RAID(Redundant Array of Inexpensive Disks)独立冗余磁盘阵列
硬盘设备需要进行持续、频繁、大量的IO操作,相较于其他设备,其损坏几率也大幅增加,导致重要数据丢
失的几率也随之增加,随着而来就产生了RAID的概念,RAID技术通过把多个硬盘设备组合成一个容量更大、
安全性更好的磁盘阵列,并把数据切割成多个区段后分别存放在各个不同的物理硬盘设备上,然后利用分散
读写技术来提升磁盘阵列整体的性能,同时把多个重要数据的副本同步到不同的物理硬盘设备上,从而起到
了非常好的数据冗余备份效果
RAID分类:硬RAID,性能较高。他们采用 PCI Express 卡物理地提供有专用的 RAID 控制器。它不会使用主
机资源。他们有 NVRAM 用于缓存的读取和写入。缓存用于 RAID 重建时,即使出现电源故障,它会使用后备
的电池电源保持缓存
软RAID,性能较低,因为其使用主机的资源。 需要加载 RAID 软件以从软件 RAID 卷中读取数据。在加载
RAID 软件前,操作系统需要引导起来才能加载 RAID 软件。在软件 RAID 中无需物理硬件。零成本投资
常用RAID级别和概念
1.新添加一块硬盘,创建ext4、xfs文件系统并自动挂载;创建swap分区并自动挂载
2.熟练磁盘命令!
级别 作用及特点
RAID0
stripe,不含校验与冗余的条带存储,无备份
多块磁盘组合为RAID 0后,每块磁盘都将会被分割为小区快(chunk),而数据会被分割成
块的大小,然后依序交错的存放到不同的磁盘中
  读写性能有提升,冗余能力无,空间利用率100%,至少需要2块磁盘
RAID1
mirror,不含校验的镜像存储 ,完整备份
多块磁盘组合为RAID 1后,数据将被同时复制到每块磁盘
  读性能有提升,写性能下降,冗余能力有,空间利用率50%,至少需要2块磁盘
RAID5
数据块级别的分布式校验条带存储 ,性能与数据备份的均衡考虑
多块磁盘组合为RAID 5后,数据将以块为单位同步式分别存储在不同的磁盘上,在数据写
入过程中,在每块磁盘还循环加入一个同位检验数据(parity),这个数据会记录其他磁
盘的备份数据,用于有磁盘损坏时的救援,不过默认仅能支持一块磁盘的损毁情况
  读写性能有提升,冗余能力有,空间利用率(n-1)/n,至少需要3块磁盘
RAID01
条带+镜像存储
Disk0与Disk1组成第一组RAID 0,Disk2与Disk3组成第二组RAID 0,然后这两组再整合成
为一组RAID 1
  读写性能有提升,冗余能力有,空间利用率50%,至少需要4块盘
RAID10
镜像+条带存储
Disk0与Disk1组成第一组RAID 1,Disk2与Disk3组成第二组RAID 1,然后这两组再整合成
为一组RAID 0
mdadm #用于管理Linux系统中的软件RAID硬盘阵列
常用参数及作用
参数 作用
-a 检测设备名称
-n 指定设备数量
-l 指定RAID级别
-C 创建
-v 显示过程
-f 模拟设备损坏
-r 移除设备
-Q 查看摘要信息
-D 查看详细信息
-S 停止RAID磁盘阵列
测试:
4. Linux LVM的管理与使用
硬盘设备管理技术虽然能够有效地提高硬盘设备的读写速度以及数据的安全性,但是在硬盘分好区或者部署
为RAID磁盘阵列之后,再想修改硬盘分区大小就不容易了,此时需要使用LVM
1.mdadm命令创建RAID10 名为md0,关闭虚拟机新添加4块硬盘,使用ext4文件系统进行测试
mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
mkfs.ext4 /dev/md0
mkdir /RAID
mount /dev/md0 /RAID
mdadm -D /dev/md0
echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab
mount -a
2.损坏磁盘阵列及修复
#模拟一块硬盘损坏情况
mdadm /dev/md0 -f /dev/sdb
mdadm -D /dev/md0
umount /RAID
mdadm /dev/md0 -a /dev/sdb
mdadm -D /dev/md0
mount -a
mdadm -r /dev/sdb
mdadm -a /dev/sdb
mount -a
LVM(Logical volume Manager)逻辑卷管理通过将底层物理硬盘抽象封装起来,以逻辑卷的形式表现给上
层系统,逻辑卷的大小可以动态调整,而且不会丢失现有数据。新加入的硬盘也不会改变现有上层的逻辑
卷。作为一种动态磁盘管理机制,逻辑卷技术大大提高了磁盘管理的灵活性
PV(Physical Volume)- 物理卷,物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也
可以是整个物理硬盘,也可以是raid设备
VG(Volumne Group)- 卷组,卷组建立在物理卷之上,一个卷组中至少要包括一个物理卷,在卷组建立之
后可动态添加物理卷到卷组中。一个逻辑卷管理系统工程中可以只有一个卷组,也可以拥有多个卷组
LV(Logical Volume)- 逻辑卷 ,逻辑卷建立在卷组之上,卷组中的未分配空间可以用于建立新的逻辑卷,逻
辑卷建立后可以动态地扩展和缩小空间。系统中的多个逻辑卷可以属于同一个卷组,也可以属于不同的多个
卷组
PE(physical extent),每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是
可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB
功能/命令 物理卷管理 卷组管理 逻辑卷管理
扫描 pvscan vgscan lvscan
建立 pvcreate vgcreate lvcreate
显示 pvdisplay vgdisplay lvdisplay
删除 pvremove vgremove lvremove
扩展   vgextend lvextend
缩小   vgreduce lvreduce
常用命令及说明
测试:
#创建逻辑卷,关闭虚拟机新添加2块硬盘
pv--->vg--->lvm
pvcreate /dev/sdb /dev/sdc #创建物理卷
vgcreate storage /dev/sdb /dev/sdc #两块硬盘加入storage卷组中
vgdisplay #vgs也可查询
lvcreate -n vo -L 150m storage #创建150mb的逻辑卷名为vo
lvdisplay #lvs也可查询
mkfs.ext4 /dev/storage/vo
mkdir /lvm
mount /dev/storage/vo /lvm
df -Th
echo "/dev/storage/vo /lvm ext4 defaults 0 0" >> /etc/fstab
5. Linux程序包管理
RPM(软件包管理器)
常用RPM命令及说明,熟悉就可以
#扩容逻辑卷为300mb
#只要卷组中有足够的资源,就可以一直为逻辑卷扩容
umount /lvm
lvextend -L 300M /dev/storage/vo
e2fsck -f /dev/storage/vo #检测磁盘
mount -a
df -Th
#缩小逻辑卷
umount /lvm
e2fsck -f /dev/storage/vo
resize2fs /dev/storage/vo 150m
lvreduce -L 150m /dev/storage/vo
mount -a
df -Th
#逻辑卷快照
#LVM还具备有“快照卷”功能,该功能类似于虚拟机软件的还原时间点功能
#快照两个特点:快照卷的容量必须等同于逻辑卷的容量
# 快照卷仅一次有效,一旦执行还原操作后则会被立即自动删除
vgdisplay #注意空间使用量!
echo "lvm test" > /lvm/readme.txt
ls -l /lvm
lvcreate -L 150m -s -n SNAP /dev/storage/vo #生成150m快照,名为snap
lvdisplay
dd if=/dev/zero of=/lvm/files count=1 bs=100M #dd 用指定大小的块拷贝一个文件
#/dev/zero是一个输入设备,用它来初始化文件,count块,bs块大小
umount /lvm
lvconvert --merge /dev/storage/SNAP #逻辑卷进行快照还原
mount -a
ls /lvm #刚才创建的100M文件已不存在,快照卷会自动删除
#删除逻辑卷
#提前备份好重要的数据信息,然后依次删除逻辑卷、卷组、物理卷设备,顺序不可颠倒!
umount /lvm
vi /etc/fstab #删除之前的自动挂载
lvremove /dev/storage/vo
vgremove storage
pvremove /dev/sdb /dev/sdc
命令 说明
rpm -q package_name.rpm 查询了软件包是否安装
rpm -qa 列出所有已安装的软件包
rpm -qf package_name.rpm 显示拥有该文件的软件包
rpm -qi package_name.rpm 显示一般信息
rpm -ql package_name.rpm 列出软件包中所有文件的名称
rpm -ivh package_name.rpm 安装软件包,以进度条显示
rpm -e package_name.rpm 卸载软件
rpm -e package_name.rpm -nodeps 忽略依赖关系的卸载
命令 作用
yum repolist all 列出所有仓库
yum list all 列出仓库中所有软件包
yum info 软件包名称 查看软件包信息
yum install 软件包名称 安装软件包
yum update 软件包名称 升级软件包
yum remove 软件包名称 删除软件包
yum clean all 清除所有仓库缓存
yum check-update 检查可更新的软件包
yum grouplist 查看系统中已经安装的软件包组
yum groupinstall 软件包组 安装指定的软件包组
yum groupremove 软件包组 删除指定的软件包组
yum groupinfo 软件包组 查询指定的软件包组信息
yum whatprovides 软件包名称 查询命令或软件包 由谁来提供
YUM(软件仓库)
Yum软件仓库便是为了进一步降低软件安装难度和复杂度而设计的技术,用来解决软件包相关依赖性
常用YUM命令及说明
YUM的配置方式主要为两种:
本地模式
网络模式
rm -rf /etc/yum.repos.d/* #删除已有的文件
cd /etc/yum.repos.d
wget http://mirrors.aliyun.com/repo/Centos-7.repo #使用阿里的源
wget http://mirrors.aliyun.com/repo/epel-7.repo #EPEL (Extra Packages for Enterprise Linux)是
基于Fedora的一个项目,为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS等
yum clean all #配置完成,清除缓存。如有问题,请参考错误信息
参数 说明
-c 创建压缩文件
-x 解压缩文件
-t 压缩包内有哪些文件
-z 用Gzip压缩或解压
-j 用bzip2压缩或解压
-v 显示压缩或解压的过程
-f 目标文件名
-p 保留原始的权限与属性
-P 绝对路径来压缩
-C 指定解压到的目录
6. Linux下压缩、归档
tar命令用于对文件进行打包压缩或解压
tar == windows(winrar、好压等软件)
打包:指将一大堆文件或目录变成一个总的文件
压缩:是将一个大的文件通过一些压缩算法变成一个小文件
Linux中压缩程序只能针对一个文件进行压缩,当想要压缩一大堆文件时,先将这一大堆文件先打成一个包
(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令)
tar命令参数及说明
rm -rf /etc/yum.repos.d/* #删除已有的文件,重新配置
vi /etc/yum.repos.d/yum.repo #yum配置结尾必须以repo结尾!
[c7] #软件源的名称
name=c7-locate #软件仓库的名称
baseurl=file:///mnt #软件源地址,将光盘挂载至mnt下即可
gpgcheck=0 #gpg的校验,确定软件包的来源有效和安全,1为启用
enabled=1 #启用源,0为禁用
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 #校验的gpg密钥
测试:
tar -cvf log111.tar log111.log #仅打包,不压缩!
tar -zcvf log.tar.gz log111.log #打包后,以gzip压缩
tar -jcvf log.tar.bz2 log111.log #打包后,以bzip2压缩。在选项f之后的文件名是新建的,用 .tar来作
为结尾
tar -zcvpf log.tar.gz log1.log log2.log log3.log #压缩并保留权限
tar -ztvf log.tar.gz #使用 gzip 压缩的log.tar.gz,所以要查看log.tar.gz包内的文件时,要加上z这个选项
tar -zxvf log.tar.gz #解压缩
tar -zxvf log30.tar.gz log2013.log #只将tar内的部分文件解压出来
7. Linux下的环境变量
程序和脚本都通过环境变量来获取系统信息、存储临时数据和配置信息
环境变量分为两类:
全局变量 #env、printenv
env
printenv
printenv HOME
echo $HOME
cd $HOME #引用环境变量
export #环境变量及设置
my_var='global var'
export my_var #不需要加$
局部变量 #set
my_var='hello'
echo $my_var
set | grep my_var
环境变量 #unset
echo $my_var
unset my_var #不需要加$
设置PATH环境变量,PATH环境变量定义了用于进行命令和程序查找的目录
echo $PATH #查询系统的环境变量
mkdir /home/scripts
touch /home/scripts/aaa
echo "echo hello,world" >> /home/scripts/aaa
echo $PATH
aaa
PATH=$PATH:/home/scripts/
echo $PATH
aaa
还有一种方式是直接在/etc/profile中设置
定位系统环境变量
在进入Linux系统启动一个bash shell时,默认情况下bash会在几个文件中查找命令。这些文件叫作启动文件
或环境文件,bash检查的启动文件取决于你启动bash shell的方式,默认有三种
登录时作为默认登录shell
/etc/profile #系统默认配置文件
$HOME/.bash_profile #用户的
$HOME/.bashrc #用户的
作为非登录shell的交互式shell
如果bash shell不是登录系统时启动的(比如是在命令行提示符下敲入bash时启动),那么启动的shell
叫作交互式shell。交互式shell不会像登录shell一样运行,但它依然提供了命令行提示符来输入命令
作为运行脚本的非交互shell
系统执行shell脚本时用的就是这种shell,没有命令符提示
数组变量
环境变量有一个很酷的特性,它们可作为数组使用。数组是能够存储多个值的变量。这些值可以单独引用,
也可以作为整个数组来引用
mytest=(one two three four five)
echo $mytest
echo ${mytest[2]}
echo ${mytest[*]}
mytest[2]=seven
echo ${mytest[*]}
unset mytest
echo ${mytest[*]}
$$是当前bash进程的pid
8. Bash基本脚本
创建简单shell脚本
显示消息echo
使用变量
用户变量
more s1.sh #s1为脚本名称,.sh为后缀
#!/bin/bash #声明用哪个shell来运行脚本
#The script displays the date and who's logged on #脚本描述信息
#Author Frank
#2018-01-01
date #代码段
who
chmod u+x s1.sh #权限 不要忘记!
./s1.sh #执行shell
#sh s1.sh #另一种执行方式
#echo,打印消息
more s2.sh
#!/bin/bash
#The examples of echo command
#
echo "The time is:" #字符串需要用''或""引起来
date
echo "The who's logged on:"
who
#$,shell中变量需要加$符
more s3.sh
#!/bin/bash
#The examples of '$'
#
echo "The user is: $USER" #echo中可以使用$变量
echo "The user id is: $UID"
echo "The user directory is: $HOME"
#$在shell中的定义变量
var1=10
VAR2=-50 #变量敏感大小写!
var_3=45.5
var_4_1='hello'
var5="hello,world" #如果在脚本中定义变量,只在脚本执行时生效!
more s4.sh
#!/bin/bash
#Testing variable
命令替换
数学运算
#
days=10
guest='alice'
echo "The user $guest logged system before $days days ago"
days=5 #变量再次被引用时,输出当前赋值
guest="tom" #也可引用变量 guest1=$guest
echo "The user $guest logged system before $days days ago"
#shell脚本有一特性 可以从命令输出中提取信息,并将其赋给变量
#`` 反引号,$()
#
date_var1=`date`
date_var2=$(date) #两种方式可行
echo $date_var1,$date_var1
more s5.sh
#!/bin/bash
#Making a new file extension
#
time=$(date +%F)
cp -a /var/log/messages /tmp/messages_bak.$time
#expr,shell中处理数学运算,只支持整形!
#bc,支付浮点!同时也是一个可交互式的编辑器
#
expr 10 + 5
expr 10 - 5
expr 10 * 5
expr 10 / 5
bc
10 / 5
10 / 4
scale=4 #浮点运算精度由内置变量scale控制
10 / 5
10 / 4
#脚本中语法,variable=$(echo "options; expression" | bc)
more s6.sh
#!/bin/bash
#The examples of simple math
#
var1=10
var2=20.23
result=$(echo "scale=2; $var1 + $var2" | bc)
echo The result is $result
9. Bash条件测试
if-then-else
more s7.sh
#!/bin/bash
#The examples of simple math part2(EOF)
var1=10.46
var2=43.67
var3=33.2
var4=71
result=$(bc << EOF
scale = 4
a1 = ($var1 * $var2)
b1 = ($var3 * $var4)
a1 + b1
EOF
)
echo $result
#if-then
#
if [ expression ]
then
Statement(s) to be executed if expression is true
fi #以fi结束
#
#如果if语句行的命令的退出状态值为0,所有的命令都会被执行;
#如果if语句行的命令的退出状态不为0,所有的命令都会被跳过;
more s8.sh
#!/bin/bash
#The examples of if-then statement
#
if pwd #如换成错误的代码会如何?
then
echo "It worked"
fi
more s81.sh #then部分也可是一段代码块
#!/bin/bash
#The examples of if-then statement part2(then)
#
t_user=alice
if grep $t_user /etc/passwd
then
echo "The user name is: $USER"
echo "The user uid is: $UID"
echo "Other dir info are: "
ls -a /home/$t_user/.b*
fi
if-then-elif-then
#if-then-else
if [ expression ]
then
Statement(s) to be executed if expression is true
else
Statement(s) to be executed if expression is not true
fi
more s9.sh
#!/bin/bash
#The examples of if-then-else statement
#
t_user=aaa #不存在用户进行测试
if grep $t_user /etc/passwd
then
echo "The user $t_user exists on system"
else
echo "The user $t_user does not exist on system."
fi
#if-then-elif-then
#else部分的另一种形式:elif,就不用再书写多个if-then语句了,代码更清晰
if [ expression 1 ]
then
Statement(s) to be executed if expression 1 is true
elif [ expression 2 ]
then
Statement(s) to be executed if expression 2 is true
elif [ expression 3 ]
then
Statement(s) to be executed if expression 3 is true
else
Statement(s) to be executed if no expression is true
fi
more s10.sh
#!/bin/bash
#The examples of if-then-elif-then statement
#
t_user=aaa
#
if grep $t_user /etc/passwd
then
echo "The user $t_user exists on this system."
#
elif ls -d /home/$t_user
then
echo "The user $t_user does not exist on this system."
echo "However, $t_user has a directory."
fi
if-then的复合条件
10. Bash条件测试
more s101.sh #elif中嵌套
#!/bin/bash
#The examples of if-then-elif-then statement,part2
#
t_user=aaa
#
if grep $testuser /etc/passwd
then
echo "The user $t_user exists on this system."
#
elif ls -d /home/$t_user
then
echo "The user $t_user does not exist on this system."
echo "However, $t_user has a directory."
#
else
echo "The user $t_user does not exist on this system."
echo "And, $t_user does not have a directory."
fi
#在elif语句中,紧跟其后的else语句属于elif代码块。它们并不属于之前的if-then代码块
#使用了elif语句的代码看起来更清晰,但是脚本的逻辑混乱,后边后讲到case来代替
#if-then语句允许使用布尔逻辑来组合测试
#[ condition1 ] && [ condition2 ] and
#[ condition1 ] || [ condition2 ] or
more s11.sh
#!/bin/bash
#The examples of if-then statement,part2
#
if [ -d $HOME ] && [ -w $HOME/testing ] #-d检查file是否存在且是一个目录,-w可写;后边会讲
then
echo "The file exists and you can write to it"
else
echo "I can not write to the file"
fi
#test,shell环境中测试条件表达式
#语法
if [ condition ] #此种方式无需在if-then语句中声明test命令
then
commands
fi
#test命令可以判断三类条件:数值比较,字符串比较,文件比较
#数值比较常用参数及描述
#比较 描述
#n1 -eq n2 检查n1是否与n2相等
#n1 -ge n2 检查n1是否大于或等于n2
#n1 -gt n2 检查n1是否大于n2
#n1 -le n2 检查n1是否小于或等于n2
#n1 -lt n2 检查n1是否小于n2
#n1 -ne n2 检查n1是否不等于n2
more s12.sh
#!/bin/bash
#Using number test evaluations
#
value1=10
value2=11
#
if [ $value1 -gt 5 ]
then
echo "The value $value1 is greater than 5"
fi
#
if [ $value1 -eq $value2 ]
then
echo "The values are equal"
else
echo "The values are different"
fi
#字符串比较常用参数及描述
#比较 描述
#str1 = str2 检查str1是否和str2相同
#str1 != str2 检查str1是否和str2不同
#str1 < str2 检查str1是否比str2小
#str1 > str2 检查str1是否比str2大
#-n str1 检查str1的长度是否非0
#-z str1 检查str1的长度是否为0
#比较字符串的相等性时,比较测试会将所有的标点和大小写情况都考虑在内!
#如果使用> 或者 < 号需要转义!
#文件比较,用的多一些!
#测试Linux文件系统上文件和目录的状态
#比较 描述
#-d file 检查file是否存在并是一个目录
#-e file 检查file是否存在
#-f file 检查file是否存在并是一个文件
#-r file 检查file是否存在并可读
#-s file 检查file是否存在并非空
#-w file 检查file是否存在并可写
#-x file 检查file是否存在并可执行
#-O file 检查file是否存在并属当前用户所有
#-G file 检查file是否存在并且默认组与当前用户相同
#file1 -nt file2 检查file1是否比file2新
#file1 -ot file2 检查file1是否比file2旧
练习:
#1.显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大
小,保存脚本为sys_info.sh
#2.将/etc/目录备份到/tmp下,并以此格式保存bak_etc_yyyy-mm-dd,保存为脚本bak_etc.sh
#3.显示当前硬盘分区中空间利用率最大的值,保存脚本为disk_used.sh
#4.显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序,保存脚本为link.sh
#5.计算/etc/passwd文件中的第5个用户和第15用户的ID之和,保存脚本为sum_id.sh
#6.统计/etc, /var, /usr目录中共有多少文件,保存脚本为sum.sh
#7.接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则输出“该IP地址可访问”;如果不可
ping通,则输出“该IP地址不可访问”,保存脚本为ping.sh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值