Linux基础——2
一、Shell命令补充
ps:
列出进程
df : 检查文件系统空间占用情况
常用参数:-a :列出所有文件系统-k :列出磁盘的分配情况(KB)-h :同-k, 但大小以G、M,K单位显示-l :仅列出本地文件系统
du:
显示磁盘空间的使用情况(查看当前目录的大小)
du命令,列出目录和文件所使用的磁盘块数,每块占512个字节。
常用参数:-a :仅列出空闲的文件数 -k :列出磁盘的使用情况(KB) -s :列出总的空闲空间(KB)
kill: 杀死进程 -9 强制终止
chmod : 改变文件或目录的访问权限
chmod 664 filename:664是权限代码 110 110 100
对于目录而言,读权限代表了能否查看目录中的所有文件
写权限代表了能否在目录中创建文件
执行权限代表了能否进入此目录
chown: 改变文件或目录的属主
用户管理
用户的属性
用户名
口令
用户ID(UID)
用户主目录(HOME)
用户shell
/etc/passwd文件是系统能够识别的用户清单
用户登陆时,系统查询这个文件,确定用户的UID并验证用户口令
登陆名
经过加密的口令
UID
默认的GID
个人信息
主目录
登陆shell
包含了UNIX组的名称和每个组中成员列表
每一行代表一个组,包括4个字段:
组名
加密的口令
GID号
成员列表,彼此用逗号隔开
添加用户
adduser
语法: adduser <username>
实例:
# adduser newuser
添加用户名为newuser的新用户
使用passwd命令可以修改用户口令
root用户可以修改任何用户的口令
语法:passwd [-k] [-l] [u] [-f] [-d] [-S] username
使用方法:
passwd username
usermod
语法:usermod [-u uid [-o]] [-g group] [-G gropup,…]
[-d home [-m]] [-s shell] [-c comment]
[-l new_name] [-f inactive][-e expire]
[-p passwd] [-L|-U] name
举例用户oldname改名为newname,注意要同时更改家目录:
usermod –d /home/newname –m –l newname oldname
deluser
语法: deluser <username>
使用方法:
deluser --remove-home user1
删除用户user1的同时删除用户的工作目录
delgroup
语法: delgroup groupname
使用方法:
delgroup groupname1
进程管理
进程:程序执行一次就是一个进程
显示进程 (process) 的动态
语法:
ps [options]
常见的参数:
-A 列出所有的行程
-w 显示加宽可以显示较多的资讯
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的行程
进程状态标志
D: 不可中断的静止
R: 正在执行中
S: 阻塞状态
T: 暂停执行
Z: 不存在但暂时无法消除
<: 高优先级的进程
N: 低优先级的进程
L: 有内存分页分配并锁在内存中
+: 表示进程属于前台进程组,可以直接与终端交互。
top 监视进程
通常会全屏显示,而且会随着进程状态的变化不断更新
整个系统的信息也会显示,为查找问题提供了便利
可以显示系统总共有多少CPU和内存资源以及负载平衡等信息。
pstree
将所有行程以树状图显示, 树状图将会以 pid (如果有指定) 或是以init这个基本进程为根,如
果有指定使用者id, 则树状图会只显示该使用者所拥有的进程。
参数:
-a 显示该进程的完整指令及参数, 如果是被记忆体置换出去的进程则会加上括号
-c 如果有重覆的进程名, 则分开列出
kill
使用kill命令终止进程
kill [-signal] PID
signal是信号,PID是进程号
kill 命令向指定的进程发出一个信号signal,在默认的情况下,kill 命令向指定进程发出信号
正常情况下,将杀死那些不捕捉或不忽略这个信号的进程
kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1
36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5
40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9
44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5
60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1
64) SIGRTMAX
文件系统
在任何一个操作系统中,文件系统无疑是其最重要的组件,用于组织和管理计算机存储设备上的大量文
件,并提供用户交互接口。Linux同样具备完善的文件系统。用户既可以使用界面友好的Nautilus图形文
件管理器,也可以使用功能强大的Shell文件系统管理工具。
Linux是一种兼容性很高的操作系统,支持的文件系统格式很多,大体可分以下几类:
磁盘文件系统:指本地主机中实际可以访问到的文件系统,包括硬盘、CD-ROM、DVD、USB存储器、磁盘
阵列等。常见文件系统格式有:autofs、coda、Ext(Extended File sytem,扩展文件系统)、
Ext3、Ext4、VFAT、ISO9660(通常是CD-ROM)、UFS(Unix File System,Unix文件系统)、
ReiserFS、XFS、JFS、FAT(File Allocation Table,文件分配表)、FAT16、FAT32、NTFS
(New Technology File System)等;
网络文件系统:是可以远程访问的文件系统,这种文件系统在服务器端仍是本地的磁盘文件系统,客户机
通过网络远程访问数据。常见文件系统格式有:NFS(Network File System,网络文件系统)、
Samba(SMB/CIFS)、AFP(Apple Filling Protocol,Apple文件归档协议)和WebDAV等;
专有/虚拟文件系统:不驻留在磁盘上的文件系统。常见格式有:TMPFS(临时文件系统)、PROCFS
(Process File System,进程文件系统)和LOOPBACKFS(Loopback File System,回送文件系
统)。
文件系统结构
Linux的文件组织模式犹如一颗倒置的树,这与Windows文件系统有很大差别。
分区与目录的关系:
在Windows下,目录结构属于分区;在Linux下,分区属于目录结构。
如何知道文件存储的具体硬件位置呢?
在Linux中,将所有硬件都视为文件来处理,包括硬盘分区、CD-ROM、软驱以及其他USB移动设备
等
在Linux中一切皆文件
Linux文件系统就是一个树形的分层组织结构。
将根(/)作为整个文件系统的惟一起点,其他所有目录都从该点出发。将Linux的全部文件按照一
定的用途归类,合理地挂载到这颗“大树”的“树枝”或“树叶”上,如图所示。而这些全不用考虑文件的实
际存储位置,无论是存在硬盘上,还是在CD-ROM或USB存储器中,甚至是网络终端。
目录名 | 描述 |
---|---|
/ | Linux文件系统根目录 |
/bin | 存放系统中最常用的可执行文件(二进制) |
/boot | 存放Linux内核和系统启动文件,包括Grub、lilo启动器程序 |
/dev | 存放所有设备文件,包括硬盘、分区、键盘、鼠标、USB、tty等 |
/etc | 存放系统的所有配置文件,例如passwd存放用户账户信息,hostname存放主机名等 |
/home | 用户主目录的默认位置 |
/initrd | 存放启动时挂载initrd.img映像文件的目录,以及载入所需设备模块的目录。 |
/lib | 存放共享的库文件,包含许多被/bin和/sbin中程序使用的库文件 |
/lost+found | 存放由fsck放置的零散文件 |
/media | Ubuntu系统自动挂载CD-ROM、软驱、USB存储器后,存放临时读入的文件 |
/mnt | 该目录通常用于作为被挂载的文件系统的挂载点 |
/opt | 作为可选文件和程序的存放目录,主要被第三方开发者用来简易地安装和卸装他们的软件包 |
/proc | 存放所有标志为文件的进程,它们是通过进程号或其他的系统动态信息进行标识,例如cpuinfo文件存放CPU当前工作状态的数据 |
/root | 根用户(超级用户)的主目录 |
/sbin | 存放更多的可执行文件(二进制),包括系统管理、目录查询等关键命令文件 |
/srv | |
/sys | |
/tmp | 存放用户和程序的临时文件,所有用户对该目录都有读写权限 |
绝对路径和相对路径
绝对路径:指文件在文件系统中的准确位置。通常在本地主机上,以根目录为起点。例如“/usr/games/gnect”就是绝对路径。
相对路径:指相对于用户当前位置的一个文件或目录的位置。例如,用户处在usr目录中时,只需要“games/gnect”就可确定这个文件。
Linux和Windows的文件系统的比较:
Linux****文件系统 | Windows****文件系统 | |
---|---|---|
文件格式 | 使用的主要文件格式有:EXT2、EXT3、 RerserFS、ISO9660、vfat等 | 使用的主要文件格式有:FAT16、 FAT32、NTFS等 |
存储结构 | 逻辑结构犹如一颗倒置的树。将每个硬件设备视为一个文件,置于树形的文件系统层次结构中。因此,Linux系统的某一个文件就可能占有一块硬盘,甚至是远端设备,用户访问时非常自然 | 逻辑结构犹如多颗树(森林)。将硬盘划分为若个分区,与存储设备一起(例如CD-ROM、USB存储器等),使用驱动器盘符标识,例如A:代表软驱、C:代表硬盘中的第一个分区等。 |
与硬盘分区的关系 | 分区在目录结构中 | 目录结构在分区中 |
文件命名 | Linux文件系统中严格区分大小写,MyFile.txt与myfile.txt指不同的文件。区分文件类型不依赖于文件后缀,可以使用程序file命令判断文件类型。 | windows文件系统中不区分大小写,MyFile.txt与myfile.txt是指同一个文件。使用文件后缀来标识文件类型。例如使用“.txt”表示文本文件。 |
路径分隔符 | Linux使用斜杠“/”分隔目录名,例如“/home/usr/share”,其中第一个斜杠是根目录(/),绝对路径都是以根目录作为起点 | Windows使用反斜杠“\”分隔目录名,例如“C:\program \username”,绝对路径都是以驱动器盘符作为起点 |
文件与目录权限 | Linux最初的定位是多用户的操作系统,因而有完善文件授权机制,所有的文件和目录都有相应的访问权限 | Windows最初的定位是单用户的操作系统,内建系统时没有文件权限的概念,后期的Windows逐渐增加了这方面的功能 |
文件类型
文件类型 | 类型符 | 描述 |
---|---|---|
普通文件 | - | 指ASCII文本文件、二进制可执行文件,以及硬件链接 |
块设备文件 | b | 块输入/输出设备文件 |
字符设备文件 | c | 原始输入/输出设备文件,每次 I/O 操作仅传送一个字符 |
目录文件 | d | 包含若干文件或子目录 |
符号链接文件 | l | 只保留了文件地址,而不是文件本身 |
命名管道 | p | 一种进程间通信的机制,用于进程间通讯的暂时文件 |
套接字 | s | 用于进程间通信,两台计算机间通讯的应用程序接口(API) |
权限
权限类型 | 应用于目录 | 应用于任何其他类型的文件 |
---|---|---|
读( r ) | 授予读取目录或子目录内容的权限 | 授予查看文件的权限 |
写( w ) | 授予创建、修改或删除文件或子目录的权限 | 授予写入权限,允许修改文件 |
执行( x ) | 授予进入目录的权限 | 允许用户运行程序 |
- | 无权限 | 无权限 |
创建、复制、删除与移动文件
在掌握文件系统导航命令,能够在树形的目录结构准确定位后,就可以开始“生产”文件了。
touch
file
cp
mv:
1、移动文件
2、重命名
当第二个参数是一个非法路径的时候将作为重命名使用
rm
链接文件
命令可以用于创建文件的链接文件。ln命令一般语法格式为:
ln [ -s ] target link_name
其中,选项“-s”表示为创建软链接。在缺省情况下,创建硬链接。参数target为目标文件,link_name为链接文件名。如果链接文件名已经存在但不是目录,将不做链接。目标文件可以是任何一个文件名,也可以是一个目录。
硬链接:创建了一个文件的另一个引用,硬链接与原始文件共享相同的inode号。删除原始文件不会影响硬链接,因为数据实际上仍然存在,只是原始文件的名字被删除了。硬链接不能跨文件系统创建,也不能对目录进行硬链接。
软链接:类似于Windows中的快捷方式,它是一个特殊类型的文件,其中包含了另一个文件的路径信息。软链接拥有自己的inode号和数据块,但数据块中存储的是另一个文件的路径。如果原始文件被删除,软链接将指向一个不存在的文件。软链接可以跨文件系统,也可以链接到目录。
归档与压缩
用户在进行数据备份时,需要把若干文件整合为一个文件以便保存。尽管整合为一个文件进行管理,但文件大小仍然没变。若需要网络传输文件时,就希望将其压缩成较小的文件,以节省在网络传输的时间。
归档:将多个文件整合成一个文件,但是保持原本的大小
压缩:将多个文件整个成一个文件,并压缩其大小小于原始大小
首先需要明确两个概念:
归档文件是将一组文件或目录保存在一个文件中。
压缩文件也是将一组文件或目录保存一个文件中,并按照某种存储格式保存在磁盘上,所占磁盘空间比其中所有文件总和要少。
因此,归档文件仍是没有经过压缩的,它所使用的磁盘空间仍等于其所有文件的总和。因而,用户可以将归档文件再进行压缩,使其容量更小。在Ubuntu Linux中使用File-Roller打包工具,可以很方便地完成文件归档和压缩。
gzip是Linux中最流行的压缩工具,具有很好的移植性,可在很多不同架构的系统中使用。bzip2在性能上优于gzip,提供了最大限度的压缩比率。如果用户需要经常在Linux和微软Windows间交换文件,建议使用zip。
压缩工具 | 解压工具 | 文件扩展名 |
---|---|---|
gzip | gunzip | .gz |
bzip2 | bunzip2 | .bz2 |
zip | unzip | .zip |
通常,用gzip压缩的文件的扩展名是.gz;用bzip2压缩的文件的扩展名是.bz2;用zip压缩的文件的扩展名是.zip。
用gzip压缩的文件可以使用gunzip解压;用bzip2压缩的文件可以使用bunzip2解压;用zip压缩的文件可以使用unzip解压。
目前,归档工具使用最广泛的tar命令,可以把很多文件(甚至磁带)合并到一个称为tarfile的文件中,通常文件扩展名为.tar。然后,再使用zip、gzip或bzip2等压缩工具进行压缩。通常,给由tar命令和gzip命令创建的文件添加.tar.gz或.tgz扩展名;给由tar命令和bzip2命令创建的文件添加.tar.bz2或.tbz2扩展名;给由tar命令和zip命令创建的文件添加.tar.z或.tbz扩展名。
tar:归档
tar命令主要用于将若干文件或目录合并为一个文件,以便备份和压缩。当然,之后出现tar程序的改进版本,可以实现在合并归档的同时进行压缩。tar命令符号模式的一般语法格式为:
tar [ -t | -x | -u | -c | -v | -f | -j | -z ] tarfile filelist
选项 | 描述 |
---|---|
-t | 显示归档文件中的内容 |
-x | 释放归档文件 |
-u | 更新归档文件 |
-c | 创建一个新的归档文件 |
-v | 显示归档和释放的过程信息 |
-f | 用户指定归档文件的文件名,否则使用默认名称 |
-j | 由tar生成归档,然后由bzip2压缩 |
-z | 由tar生成归档,然后由gzip压缩 |
解压释放
tar -zxvf Generics.tar.gz
归档压缩
tar -zcvf Generics.tar.gz Generics/
网络配置
IP地址包括三部分:Internet网络号(Net-ID)、子网号(Subnet-ID)和主机号(Host-ID)。
因而可以这样解释:一个IP地址惟一标识了,处在某个互联网中的,某个子网的,某个网络接口
根据Internet网络号的字段长度(1,2,3字节长),IP地址区分为A类、B类、C类。三类IP地址的掩码如下所示。
A类地址的默认子网掩码是255.0.0.0,或0xFF000000;
B类地址的默认子网掩码是255.255.0.0,或0xFFFF0000;
C类地址的默认子网掩码是255.255.255.0,或0xFFFFFF00;
IP网络中通常用最小的IP地址标识网络本身,将最大的IP地址作为该网络的广播地址,其余所有IP地址都分配给网络中的主机。然而,局域网中的主机并不能直接访问Internet,需要通过一个作为代理的网关或网络地址转换服务(NAT)才能访问Internet。通常将IP地址的第一个或最后一个留给该网络的Internet网关。
在网络中,依靠IP地址标识主机,依靠路由表传输数据。因为计算机网络是一个复杂的网状结构系统,若将数据包发送到目标地址,主机需要一个向导——路由表,以便知道下一步发送数据包的地址。
接入网络的计算机主机依靠IP地址,惟一地标识其在网络中的身份,因此为主机配置IP地址是接入网络的关键。配置IP地址的方法有两种:
配置静态IP:在主机进入网络之前,事先为主机设置固定的IP地址;
配置动态IP:选择DHCP网络服务,在主机进入网络之后,动态随机获取IP地址。
命令
ifconfig是GNU/Linux中配置网卡的基本命令,包含在net-tools软件包中。它可用于显示或设置网卡的配置,如IP地址、子网掩码、最大分组传输数、IO端口等,还可以启动或禁用网卡。ifconfig命令有以下两种格式:
ifconfig [interface]
ifconfig interface [aftype] option | address…
ifconfig的第一种格式用于查看当前系统的网络配置情况;第二种格式用于配置网卡,包括添加、删除网卡,以及绑定多个IP地址等。
设置网卡的IP地址
sudo ifconfig ens33 192.168.182.128 netmask 255.255.255.0
sudo ifconfig ens33 down
sudo ifconfig ens33 up
在大型网络中,由于存在许多的移动计算机系统,随时都可能进入网络,在每次更换网络时,就不得不重新配置网络信息。如果计算机在网络里能够自动获取IP地址、子网掩码、路由表、DNS服务器地址等网络信息,具有动态配置IP的能力,就可以大大简化客户端的网络配置难度。动态主机配置协议(DHCP,Dynamic Host Configuration Protocol)可以实现动态分配IP资源。
netstat
netstat命令包含在net-tools软件包中,用于显示系统中当前网络的状况,包括网络连接、路由表、接口统计信息、最大分组传输单位等信息。但是,若要显示所需信息,必须明确给出netstat的第二个参数。netstat命令格式如下所示。
netstat [ -r | -g | -i | -M | -s ]
netstat命令不带任何参数,是列出主机所有开放的网络套接字信息,包括协议、接收和发送队列的大小,以及协议的内部状态
netstat 参数 | 用途 | 对应配置文件 |
---|---|---|
-r | 显示路由表 | /proc/net/route |
-g | 显示IPv4和IPv6的多卡组成员 | /proc/net/route |
-i | 显示网络接口列表 | |
-M | 显示最大连接数 | |
-s | 显示每个协议的统计数据 | /proc/net/snmp |
ping
ping(Packet Internet Groper)命令可能是最有名气的网络连接检测工具。它使用了Internet控制报文协议(ICMP)回送请求与回送应答报文,测试两个主机之间的连通性。该命令的一般格式如下所示。
ping [DomainName | IP-address
ping命令测试的远程主机,既可用域名,也可用IP地址标识。
DNS域名解析可以在更大范围的计算机网络、Internet,提供域名到IP地址的转换。网络中的每台计算机都是一个DNS客户端,向DNS服务器提交域名解析的请求;DNS服务器完成域名到IP地址的映射。
因此DNS客户端至少有一个DNS服务器地址,作为命名解析的开端。
重启网络服务
sudo service network-manager restart
二、Shell脚本
编译型语言 需要经过编译器编译之后才能执行 解释型语言
可以直接运行的语言
Shell脚本语言是解释型语言
Shell脚本的本质: Shell命令的有序集合。
1.Shell步骤
Step1.建立shell文件 包含任意多行操作系统命令或shell命令的文本文件; Step2.赋予shell文件执行权限 用chmod命令修改权限; Step3.执行shelI文件 直接在命令行上调用shell程序.
Step4:指定路径或修改环境变量PATH后执行shell程序 $ ./prog 1.sh
2.变量
Shell允许用户建立变量存储数据,但不支持数据类型(整型、字符、浮点型),将任何赋给变量的值都解释为一串字符 Variable=value 命名规则同C++中的命名规则
count=1
echo $count
DATE=`date`
echo $DATE
Bourne Shell有如下四种变量: 用户自定义变量 位置变量即命令行参数 预定义变量 环境变量
(1)用户自定义变量
在shell编程中通常使用全大写变量,方便识别
$ COUNT=1
变量的调用:在变量前加$
$ echo $HOME
Linux Shell/bash从右向左赋值
$Y=y
$ X=$Y
$ echo $X
y
使用unset命令删除变量的赋值
$ Z=hello
$ echo $Z
hello
$ unset Z
$ echo $Z
(2)位置变量
$0 与键入的命令行一样,包含脚本文件名
$1,$2,……$9 分别包含第一个到第九个命令行参数
$# 包含命令行参数的个数
$@ 包含所有命令行参数:“$1,$2,……$9”
$? 包含前一个命令的退出状态
$* 包含所有命令行参数:“$1,$2,……$9”
$$ 包含正在执行进程的ID号
(3)环境变量
HOME: /etc/passwd文件中列出的用户主目录
IFS:Internal Field Separator, 默认为空格,tab及换行符
PATH :shell搜索路径
PS1,PS2:默认提示符($)及换行提示符(>)
TERM:终端类型,常用的有vt100,ansi,vt200,xterm等
3.功能语句
shell 程序由零或多条shell语句构成。 shell语句包括三类:说明性语句、功能性语句和结构性语句。 说明性语句: 以#号开始到该行结束,不被解释执行 功能性语句: 任意的shell命令、用户程序或其它shell程序。 结构性语句: 条件测试语句、多路分支语句、循环语句、循环控制语句等。
(1)说明型语句
注释行可以出现在程序中的任何位置,既可以单独占用一行, 也可以接在执行语句的后面. 以#号开始到所在行的行尾部分,都不被解释执行. 例如:
#! /bin/sh
#
# 本程序说明
#
command_1
command_2 # command_2的语句说明
……
# 下面程序段的说明
command_m
……
command_n # commandn_语句的说明
……
#! /bin/sh :告诉OS用哪种类型的shell来解释执行该程序
(2)功能型语句
read
read从标准输入读入一行, 并赋值给后面的变量,其语法为:
. read var
把读入的数据全部赋给var
. read var1 var2 var3
把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2, ……把其余所有的词赋给最后一个变量.
如果执行read语句时标准输入无数据, 则程序在此停留等侯, 直到数据的到来或被终止运行。
(3)expr命令 运算
算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。例如:
expr 12 + 5 \* 3
27
expr 3 - 8 / 2
-1
num=9
sum=`expr $num \* 6 `
echo $sum
54
(4) test命令
s1 = s2 测试两个字符串的内容是否完全一样
s1 != s2 测试两个字符串的内容是否有差异
-z s1 测试s1 字符串的长度是否为0
-n s1 测试s1 字符串的长度是否不为0
整数:
a -eq b 测试a 与b 是否相等
a -ne b 测试a 与b 是否不相等
a -gt b 测试a 是否大于b
a -ge b 测试a 是否大于等于b
a -lt b 测试a 是否小于b
a -le b 测试a 是否小于等于b
文件:
-d name 测试name 是否为一个目录
-e name 测试一个文件是否存在
-f name 测试name 是否为普通文件
-L name 测试name 是否为符号链接
-r name 测试name 文件是否存在且为可读
-w name 测试name 文件是否存在且为可写
-x name 测试name 文件是否存在且为可执行
-s name 测试name 文件是否存在且其长度不为0
f1 -nt f2 测试文件f1 是否比文件f2 更新
f1 -ot f2 测试文件f1 是否比文件f2 更旧
test命令测试的条件成立时, 命令返回值为真(0),否则返回值为假(非0).
(5)结构型语句
结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。
主要包括:条件测试语句(两路分支)、多路分支语句、循环语句、循环控制语句和后台执行语句等。
分支语句
if…then…fi
语法结构:
if 表达式
then 命令表
fi
如果表达式为真, 则执行命令表中的命令; 否则退出if语句, 即执行fi后面的语句。
if和fi是条件语句的语句括号, 必须成对使用;
命令表中的命令可以是一条, 也可以是若干条。
if…then…else…fi
语法结构为:
if 表达式
then 命令表1
else 命令表2
fi
如果表达式为真, 则执行命令表1中的命令, 再退出if语句; 否则执行命令表2中的语句, 再退出if语句.
(6)多路分支命令 case
case…esac
多路分支语句case用于多重条件测试, 语法结构清晰自然. 其语法为:
case 字符串变量 in
模式1)
命令表1
;;
模式2 | 模式3)
命令表2
;;
……
模式n)
命令表n
;;
esac
注意:
1、case语句只能检测字符串变量
2、各模式中可用文件名元字符,以右括号结束
3、次可以匹配多个模式用“|”分开
4、命令表以单独的双分号行结束,退出case语句
5、模式 n常写为字符* 表示所有其它模式
6、最后一个双分号行可以省略
三、Shell各语法示例
1.变量定义+赋值示例
#! /bin/sh
count=100
echo count = $count
Y='y'
X=$Y
echo X = $X
Z=hello
echo Z = $Z
unset Z
echo unset Z = $Z
输出结果
count = 100
X = y
Z = hello
unset Z =
2.位置变量示例
#! /bin/sh
echo 第一个参数是 $1
echo 第二个参数是 $2
echo 参数个数 $#
echo 所有参数 $@
echo 所有参数 $*
命令行输入 ./test2.sh aa bb cc dd
输出结果
第一个参数是 aa
第二个参数是 bb
参数个数 4
所有参数 aa bb cc dd
所有参数 aa bb cc dd
3.read 输入的用法示例
#! /bin/sh
#read 从命令行读入参数
read -p "input 3 params: " var1 var2 var3
echo 参数1: $var1
echo 参数2: $var2
echo 参数3: $var3
输出结果
input 3 params: 100 200 300
参数1: 100
参数2: 200
参数3: 300
4.expr 用例
#! /bin/bash
echo "input two params to get the add result."
#获取第一个参数
read -p "param_1 number1: " num1
#获取第二个参数
read -p "param_2 number2: " num2
#计算
result=$(expr $num1 + $num2)
echo The result is $result
输出结果
input two params to get the add result.
param_1 number1: 100
param_2 number2: 200
The result is 300
5.if elif else 用法示例
#! /bin/sh
read -p "please input your id : " ID
read -p "please input your password: " PSW
admin="admin"
guest="guest"
psw1="123456"
psw2="123123"
if [ $ID = $admin ]; then
if [ $PSW = $psw1 ]; then
echo welcome,admin
else
echo your id or password is worn!
fi
elif [ $ID = $guest ]; then
if [ $PSW = $psw2 ]; then
echo welcom,guest
else
echo your id or password is worn!
fi
else
echo your id or password is worn!
fi
运行结果1
please input your id : admin
please input your password: 123456
welcome,admin
运行结果2
please input your id : guest
please input your password: 123123
welcom,guest
运行结果3
please input your id : 123
please input your password: 123
your id or password is worn!
6.if中多条件示例
#! /bin/bash
read -p "please input a year: " year
if [ $(($year % 400)) == 0 ] || ([ $(($year % 4)) == 0 ] && [ $(($year % 100)) != 0 ])
then
echo $year 是闰年!
else
echo $year 不是闰年!
fi
运行结果1
please input a year: 2000
2000 是闰年!
运行结果2
please input a year: 2002
2002 不是闰年!
7.case 语句示例(简单四则运算)
#! /bin/bash
read -p "input num1: " NUM1
read -p "input num2: " NUM2
read -p "input op: " OP
result=0
case $OP in
"+")
result=$(expr $NUM1 + $NUM2)
echo $NUM1 + $NUM2 = $result
;;
"-")
result=$(expr $NUM1 - $NUM2)
echo $NUM1 - $NUM2 = $result
;;
"*")
result=$(expr $NUM1 \* $NUM2)
echo $NUM1 "*" $NUM2 = $result
;;
"/")
if [ $NUM2 == 0 ]
then
echo 除数不能为0!
else
result=$(expr $NUM1 / $NUM2)
echo $NUM1 / $NUM2 = $result
fi
;;
esac
运行结果汇总
#运行结果1
input num1: 100
input num2: 200
input op: +
100 + 200 = 300
#运行结果2
input num1: 5
input num2: 4
input op: -
5 - 4 = 1
#运行结果3
input num1: 30
input num2: 5
input op: *
30 * 5 = 150
#运行结果4
input num1: 100
input num2: 0
input op: /
除数不能为0!
#运行结果5
input num1: 50
input num2: 3
input op: /
50 / 3 = 16
8.for循环示例
1~100的累加和
$((运算表达式)) 等同于 $(expr 表达式)
#! /bin/bash
sum=0
for i in {1..100};do
sum=$(($sum + i))
done
echo 1~100的数字累加和为: $sum
输出1~100以内的质数
#! /bin/bash
echo 100以内的质数:
for ((i=2;i<=100;i++))
do
flag=1
for ((j=2;j<i;j++))
do
if ((i % j == 0))
then
flag=0
break
fi
done
if ((flag == 1))
then
echo -n "$i ";
fi
done
echo
运行结果
100以内的质数:
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