Linux介绍
Linux
内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds
)在赫尔辛基大学上学时出于个人爱好而编写的。
Linux
是一套免费使用和自由传播的类 Unix
操作系统,是一个多用户、多任务、支持多线程和多CPU的操作系统。伴随着互联网的发展,Linux得到了来自全世界软件爱好者、组织、公司的支持。
Linux
能运行主要的 UNIX
工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux
继承了 Unix
以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
Linux不仅系统性能稳定,而且具有开放源码、没有版权、技术社区用户多等特点 ,开放源码使得用户可以自由裁剪,灵活性高,功能强大,成本低。其核心防火墙组件性能高效、配置简单,保证了系统的安全。在很多企业网络中,为了追求速度和安全,Linux
操作系统不仅仅是被网络运维人员当作服务器使用。
目前市面上较知名的发行版有:Ubuntu
、RedHat
、CentOS
、Debian
、Fedora
、SuSE
、OpenSUSE
、Arch Linux
、SolusOS
等。
国内开源镜像地址:
http://mirrors.163.com/
http://mirrors.sohu.com/
https://developer.aliyun.com/mirror/
http://mirrors.yun-idc.com/
虚拟机
虚拟机(Virtual Machine
)指通过 软件模拟 的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。在实体计算机中能够完成的工作在虚拟机中都能够实现。在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存容量。
目前常用的虚拟机软件有:VMware Workstation
、VirtualBox
虚拟网络
VMware
为虚拟机的网络配置提供了以下4 种不同的模式: 桥接模式( Bridged
) 、网络地址转换模式( NAT
) 、主机模式( Host-Only
) 和定制模式( Custom
) 。
VMware
虚拟交换机有特殊的命名规则, 格式为:VMnet +交换机编号, 并且默认有不同类型的网络和其相关联。例如, 其中VMnet0
默认为桥接模式, VMnet1
默认为主机模式, VMnet8
默认为NAT
模式, 其余的虚拟交换机默认为定制模式`。但是上述默认类型也是可以进行修改的。
- 桥接模式:
- 本地物理网卡和虚拟网卡通过VMnet0虚拟交换机进行桥接,虚拟机和主机位于
VMnet0
这个虚拟交换机的两端,这个交换机使得两端处在同一个网段中。即桥接模式下主机和虚拟机相当于同一个局域网中的两台电脑,虚拟机和宿主机处于同等地位。 - 这种情况下主机和虚拟机要能够通讯,需要在同一个网段,这就需要手动配置虚拟系统的IP地址和子网掩码,保证虚拟机和宿主机处在同一网段中。虚拟机作为一台独立的主机可以与局域网中的任何一台电脑通信。
- 本地物理网卡和虚拟网卡通过VMnet0虚拟交换机进行桥接,虚拟机和主机位于
- 网络地址转换模式 :
- 不需要任何手动的配置,虚拟系统处于虚拟的
NAT
网络中,虚拟机虚拟出了一个NAT
服务器,使其虚拟网卡能够连接到Internet
。 VMnet8
虚拟网卡的IP
地址是在安装VMware
时由系统指定生成的(动态的),虚拟机虚拟出来的NAT
网络所处的网段和VMnet8
虚拟网卡所处的网段是相同的,所以主机和虚拟机的两个虚拟网卡之间可以正常通信。
- 不需要任何手动的配置,虚拟系统处于虚拟的
- 主机模式:
- VMnet1是宿主机用于与
Host-Only
虚拟网络进行通信的虚拟网卡,但Host-Only
网络没有NAT
服务,所以虚拟网络是不能连接到外部的互联网的,虚拟机之间形成的虚拟网络是一个全封闭的网络,和外部的唯一联系就是虚拟机能够和主机进行通信。
- VMnet1是宿主机用于与
虚拟机/Linux安装(CentOS)
常用命令
官方参考地址
Linux 命令特点
- 在Linux系统中,命令区分大小写。在命令行中,可以使用
Tab
键来自动补齐命令。 - 利用向上或向下的光标键,可以翻查曾经执行过的历史命令,并可以再次执行。
- 如果要在一个命令行上输入和执行多条命令,可以使用分号来分隔命令,如
cd /;ls
。 - 断开一个长命令行,可以使用反斜杠
\
,可以将一个较长的命令分成多行表达,增强命令的可读性。执行后,shell自动显示提示符>
,表示正在输入一个长命令,此时可继续在新行上输入命令的后续部分。
磁盘管理
cd
: 切换目录ll
、ls
、ll -a
、ls -a
: 列出当前目录下目录及文件mkdir [-mp]
: 创建目录/文件夹 ,m
: 配置权限p
: 递归创建多个目录rmdir [-p] 目录名
: rmdir命令用于删除空目录,-p
同时删除父级目录pwd
: 显示当前目录
文件管理
mv
: 移动或重命名 文件/文件夹rm [-rf]
: 删除文件、强制递归删除目录和文件 r : 递归删除 i : 互动模式 f : 忽略不存在的touch
: 创建空文件或将文件的最后修改时间改为当前时间cat
: 将整个文件的内容输出到控制台more
: 逐屏输出(按空格键往下翻页,回车键逐行显示,按Q
键退出)-num
:这里的num是一个数字,用来指定分页显示时每页的行数。+num
:指定从文件的第num行开始显示。
less
: 逐屏输出(按pgUp
、pgDn
上下翻页,按Q
退出,也可使用方向键控制移动)less
命令还支持在一个文本文件中进行快速查找。先按下斜杠键/
,再输入要查找的单词或字符。less
命令会在文本文件中进行快速查找,并把找到的第一个搜索目标高亮度显示。
head
/tail [-f]
: 显示头10行/ 末尾10行f
: 动态打印信息-n num
:显示指定文件的前num
行-c num
:显示指定文件的前num
个字符
cp [-rf]
: 文件或目录拷贝-a
:尽可能将文件状态、权限等属性照原状予以复制。-f
:如果目标文件或目录存在,先删除它们再进行复制(即覆盖),并且不提示用户。-i
:如果目标文件或目录存在,提示是否覆盖已有的文件。-R
:递归复制目录,即包含目录下的各级子目录
find -name <文件名>
: 查找文件-name filename
:查找指定名称的文件。-user username
:查找属于指定用户的文件。-group grpname
:查找属于指定组的文件。-print
:显示查找结果。-type
:查找指定类型的文件。文件类型有:b(块设备文件)、c(字符设备文件)、d(目录)、p(管道文件)、l(符号链接文件)、f(普通文件)。
locate
: 在 linux 系统中搜索文件或目录,与 window 中的搜索一样。-c
: 只输出找到的数量-i
: 忽略大小写-r
: 使用基本正则表达式
grep
命令用于查找文件中包含有指定字符串的行:grep [参数] 要查找的字符串 文件名-c
:对匹配的行计数。-l
:只显示包含匹配模式的文件名。-n
:每个匹配行只按照相对的行号显示。-i
:对匹配模式不区分大小写。- 在grep命令中,字符 ^ 表示行的开始,字符 $ 表示行的结尾。如果要查找的字符串中带有空格,可以用单引号或双引号括起来。
whereis
: 查找文件,主要用于程序名的搜索which
: 搜索某个系统命令的设置,并返回第一个搜索结果echo $PATH
可以PATH
配置信息
系统管理
date -s [string]
: 查看当前系统时间 / 修改shutdown -h now
: 关机poweroff
reboot
: 重启shutdown -r now
ps [-ef | -aux]
: 查看系统进程kill [-9] pid
: 杀死指定pid
进程 /-9
强制杀掉su
: 切换用户top
: 动态显示系统运行负载情况 退出ctrl + z
hostnamectl
: 查询系统信息who
: 查看当前登录的所有用户信息clear
: 清屏free
:命令主要用来查看系统内存、虚拟内存的大小及占用情况date
: 命令可以用来查看系统当前的日期和时间
用户管理
useradd
: 添加用户userdel [-r home目录]
: 删除用户及用户 家目录passwd [用户]
: 修改[当前 | 指定]用户密码
网络通信
ifconfig / ip addr
: 查看系统ip
netstat -nlp
: 查看网络端口信息ping
: 检查网络地址/域名是否可以连通wget 文件地址
: 下载文件
1. 网卡配置文件的前缀则以ifcfg开始,如ifcfg-ens33
2. 通过网卡配置文件配置网络:切换到存放着网卡的配置文件 (/etc/sysconfig/network-scripts)
3. 通过编辑该文件中的配置信息可以进行自定义静态网络配置
TYPE=Ethernet # 设备类型 (默认即可)
BOOTPROTO=static # 地址分配模式(静态IP 修改)
NAME=ens33 # 网卡名称 (默认即可)
ONBOOT=yes # 是否启动 (自动启动 修改)
IPADDR=192.168.10.6 # IP地址 (自定义静态IP 新增)
NETMASK=255.255.255.0 # 子网掩码 (固定掩码 新增)
GATEWAY=192.168.10.2 # 网关地址 (固定网关 新增)
DNS1=192.168.10.2 # DNS地址 (固定DNS与网关一致即可 新增)
# NetworkManager是管理和监控网络设置的守护进程,设备即网络接口,连接是对网络接口的配置。
# 一个网络接口可以有多个连接配置,但同时只有一个连接配置生效
nmcli connection add con-name test type Ethernet ifname ens32 # 创建新连接配置test,IP通过DHCP自动获取
nmcli connection delete test # 删除连接
# 创建新的连接配置test2,指定静态IP,不自动连接
nmcli connection add con-name test2 ipv4.method manual ifname ens32 autoconnect no type Ethernet ipv4.addresses 192.168.10.100/24 gw4 192.168.10.1
# 参数说明
1. con-name:指定连接名字,没有特殊要求。
2. ipv4.methmod:指定获取IP地址的方式。
3. ifname:指定网卡设备名,也就是次配置所生效的网卡。
4. autoconnect:指定是否自动启动。
5. ipv4.addresses:指定IPv4地址。
6. gw4:指定网关。
# 启用 test 连接配置
nmcli connection up test
# 查看是否生效
nmcli device show ens32
防火墙管理
$ firewall-cmd --state # 查看防火墙状态
$ systemctl stop firewalld # 关闭防火墙
$ systemctl start firewalld # 开启防火墙
$ systemctl restart firewalld # 重启防火墙
$ systemctl disable firewalld # 禁用防火墙
$ firewall-cmd --list-all # 查看防火墙规则
$ firewall-cmd --query-port=8080/tcp # 查看端口是否开放
$ firewall-cmd --permanent --add-port=3306/tcp # 开放 3306 端口,永久生效
$ firewall-cmd --permanent --remove-port=3306/tcp # 移除端口号
$ firewall-cmd --reload # 重新加载防火墙配置
$ firewall-cmd --zone=public --list-ports # 查看所有开放的端口列表
文件权限
- chmod:变更权限
# 语法:
$ chmod [-R] xyz 文件或目录
# 选项与参数:
xyz : 数字类型的权限属性,为 rwx 属性数值的相加。
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更
Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的 read/write/**execute **权限。我们可以使用数字来代表各个权限,各权限的分数对照表如下: r : 4 w : 2 x : 1
$ chmod 777 .bashrc
还有一个改变权限的方法,使用对应的字母 u, g, o 来代表三种身份的权限!还有一个 a 表示 全部身份,而权限就可以写成 r , w, e
$ chmod u=rwx,g=rx,o=r .bashrc
$ chmod a+rw .bashrc
chown [-R] user[:group] file
: 修改文件所属用户:用户组
chown -R mysql:mysql /usr/local/mysql-5.7.18
chgrp 用户 文件名
:修改文件所属用户组id 用户
:查看用户所在组
文档管理
grep
: 文本搜索,与其他查看命令组合使用ps -aux | grep 8080
/cat centos.log | grep log
sort
: 排序cat centos.log | sort
管道可以多次使用uniq
: 去除重复行cat centos.log | sort | uniq
wc
: 统计行数、单词数、字符数cat centos.log | wc
备份压缩
tar
: 解压、压缩- 压缩指定文件:
tar -zcvf centos.tar.gz centos.log centos2.log
- 解压到指定目录:
tar -zxvf centos.tar.gz -C /home/centos/tar
- 压缩指定文件:
-z
用Gzip
压缩或解压-c
创建压缩文件-v
显示压缩或解压的过程
-f
目标文件名-x
解开压缩文件-C
指定解压到的目录
zip
: 压缩、解压- 压缩:
zip centos.zip centos.log centos2.log
- 解压:
unzip centos.zip
- 压缩:
vim编辑器
vim
是一款编辑器,基于vi
,对于开发者来说,vim
的用途非常广泛。但是,对于初学者来说,vim
又显得非常不友好,甚至连退出都不是那么简单。对于熟悉 vim
的人来说,这是一个非常好的工具。甚至可以不依赖鼠标就能完成所有的编辑工作。
它有三种模式:编辑模式、插入(输入)模式和命令模式
在编辑模式下的命令说明
移动光标的方法 | |
---|---|
n<Enter> | n为数字。光标向下移动n行(常用) |
n<space> | n表示数字,例如20。按下数字后再按空格键,光标会向右移动这一行的n个字符。 |
0 或功能键Home | 这是数字0:移动到这一行的首字符处(常用) |
$ 或功能键End | 移动到这一行的末字符处(常用) |
G | 移动到文件的最后一行(常用) |
nG | n为数字。移动到文件的第n行。例如输入20G则会移动到文件的第20行(可配合:set nu) |
gg | 移动到文件的第一行,相当于1G(常用) |
查找与替换 | |
---|---|
/word / ?word | 向下/向上寻找名称为word的字符串 |
n | 这个n是英文按键。代表重复前一个查找的动作。 |
N | 这个N是英文按键。与n刚好相反,为反向进行前一个查找动作。 |
:n1,n2 s/word1/word2/g | 在第n1~n2行寻找word1这个字符串,并将该字符串取代为word2!(常用) |
:1,$ s/word1/word2/g | 从第一行到最后一行寻找word1字符串,并将该字符串取代为word2(常用) |
:% s/word1/word2/gc | 全部替换,且在取代前显示提示字符给用户确认(confirm)是否需要取代(常用) |
删除、复制与粘贴 | |
---|---|
dd | 删除光标所在的那一整列(常用) |
ndd | n为数字。删除光标所在的向下n列,例如,20dd是删除20列(常用) |
yy | 复制光标所在的那一行(常用) |
nyy | n为数字。复制光标处向下n行,例如20yy是复制20行(常用) |
p, P | p为将已复制的数据在光标下一行粘贴上,P则为粘贴在光标上一行! |
ZZ | 这是大写的Z。若文件没有更改,则不储存离开;若文件已经被更动过,则储存后离开 |
u | 复原前一个动作(常用) |
. | 重复前一个动作的意思。如果你想要重复删除、重复粘贴等动作,按下小数点就可以(常用) |
在输入模式的命令说明
命 令 | 说 明 |
---|---|
i | 从光标所在位置前开始插入文本 |
I | 该命令是将光标移到当前行的行首,然后插入文本 |
a | 用于在光标当前所在位置之后追加新文本 |
A | 将光标移到所在行的行尾,从那里开始插入新文本 |
o | 在光标所在行的下面新开一行,并将光标置于该行行首,等待输入 |
O | 在光标所在行的上面插入一行,并将光标置于该行行首,等待输入 |
Esc | 退出编辑模式或回到编辑模式中(常用) |
说明:上面这些按键中,在vim画面的左下角处会出现“–INSERT–”或“–REPLACE–”的字样。由名称就知道该动作了。需要特别注意的是,我们上面也提过了,想要在文件里面输入字符,一定要在左下角处看到INSERT或REPLACE才能输入。
在命令模式的按键说明
如果是输入模式,先按“Esc”键进入编辑模式,在编辑模式下按“:”进入命令模式。
命令 | 说明 |
---|---|
:w、:wq、:wq!、:q 、:q! | 保存、保存退出、强制保存退出、退出、强制退出 |
:r 文件路径 | 读取其他文件内容追加到当前文档中 |
:e! | 恢复到文件打开后,没有进行修改时的状态 |
:w [filename] | 将编辑的数据储存成另一个文件(类似另存为新文件) |
:n1,n2 w [filename] | 将n1到n2的内容储存成filename这个文件 |
:! command | 暂时退出vim到命令列模式下执行command的显示结果。例如,“:! ls /home ”即可在vim当中查看/home下面以ls输出的文件信息 |
:set nu | 显示行号,设定之后,会在每一行的前缀显示该行的行号 |
:set nonu | 与:set nu 相反,为取消行号 |
:noh | 取消搜索标注的高亮 |
:set fileformat=unix | 将window中文件格式转换为unix文件格式,主要是换行符不一样 |
Visualmode可视化模式
编程或修改服务器配置文件的时候,需要进行多行处理,可以使用使用Visual模式。
批量删除
1.按Ctrl + V进入列编辑模式
2.通过向下或向上移动光标,选中要删除的行
3.按键盘D键,就会删除选中部分内容
批量修改
1.按Ctrl + V进入列编辑模式
2.通过向下或向上移动光标,选中要修改的行
3.按键盘大写的I进入输入模式,修改内容
修改完毕后,再按ESC键,就会应用到所有行中
rpm、yum和apt-get
-
RPM(
Redhat
Package
Manager
,就是Redhat
的包管理器)是Red Hat
公司随Redhat Linux
推出了一个软件包管理器,通过它能够更加轻松容易地实现软件的安装。- 安装软件 :
rpm -ivh package-name
i
: 安装v
: 显示安装的详细界面h
: 显示安装进度 - 卸载软件 :
rpm -e --nodeps gcc
nodeps
: 不考虑依赖关系force
: 强制处理 - 查找软件是否安装 :
rmp -qa | grep <keyword>
- 安装软件 :
-
Yum(全称为 Yellow dog Updater, Modified)Shell前端软件包管理器 。基於
RPM
包管理,能够从指定的服务器自动下载RPM
包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。Yum
提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。- Yum的命令语法:
yum [options] [subcommand] [package ...]
- options:可选
-h
:显示帮助信息;-y
:对所有的提问都回答“yes
”;-c
:指定配置文件;-q
:安静模式;-v
:详细模式;-C
:完全从缓存中运行,而不去下载或者更新任何头文件。
- command:要进行的操作
install
:安装rpm
软件包;update
:更新rpm
软件包;remove
:删除指定的rpm
软件包;list
:显示软件包的信息;search
:检查软件包的信息;info
:显示指定的rpm
软件包的描述信息和概要信息;clean
:清理yum
过期的缓存;deplist
:显示rpm
软件包的所有依赖关系。
- options:可选
- package 操作的对象
$ yum install package1 #安装指定的安装包
$ yum update package1 #更新指定程序包
$ yum info package1 #显示安装包信息package1
$ yum list installed java* #显示所有已经安装和可以安装的程序包
$ yum search string #根据关键字string查找安装包
$ yum remove | erase package1 #删除程序包package1 | 不保留软件包的数据和配置文件
$ yum clean packages: #清除缓存目录下的软件包
apt-ge
t 包管理应用软件,由apt-get
管理的软件包可以轻松做到一键安装卸载。在Ubuntu\Deepin
系统中,经常使用,由于常常需要root
权限来操作,所以搭配sudo
更加方便。
$ sudo apt-get install XXX # 一键安装软件包,这个指令会自动检测并安装依赖
$ sudo apt-get install -y XXX # 不需要重复地确认安装,所有交互都是 yes
$ sudo apt-get install -q XXX # 静默安装,当然也不是完全静默,会将低等级的log信息屏
$ sudo apt-get --reinstall install packagename # 修复或者安装最新版
$ sudo apt-get remove XXX # remove仅仅卸载软件,但是并不卸载配置文件
$ sudo apt-get purge XXX # 卸载指令,同时卸载相应的配置文件
$ sudo apt-get autoremove # 在卸载软件的时候同时卸载那些当初作为依赖但是现在并不需要的包,慎用
$ sudo apt-get update # 将所有包的来源更新,也就是提取最新的包信息
$ sudo apt-cache search <key> # 查找包含部分 key 的软件包
yum提示Another app is currently holding the yum lock; waiting for it to exit…
$ kill -s 9 25960 # 强制杀死进程
$ ps aux|grep yum # 查看yum 是否还存在
Linux Shell脚本
了解 Shell Script
Shell Script
(程序化脚本),它是利用Shell的功能缩写的一个程序。
- Shell脚本程序是解释型的,也就是说Shell脚本程序不需要进行编译,就能直接逐条解释,逐条执行脚本程序的源语句。
- Shell脚本程序的处理对象只能是文件、字符串或者命令语句,而不像其他的高级语言有丰富的数据类型和数据结构。
在shell Script撰写中的注意事项
- 命令的执行是从上而下、从左而右进行的。
- 命令、选项与参数间的多个空格都会被忽略掉。
#
可作为注解。任何加在#
后面的数据将全部被视为注解文字而被忽略。
运行Shell Script程序
现在我们假设程序文件名是 /root/scripts/hell.sh
,那如何运行这个文件呢?很简单,可以有下面几个方法。
- 直接命令下达:
shell.sh
文件必须要具备可读与可运行(rx)的权限。绝对路径
:使用/root/scripts/shell.sh
来下达命令。相对路径
:假设工作目录在/root/scripts/
,则使用./shell.sh
来运行。
- 以bash程序来运行:通过
bash shell.sh
或sh shell.sh
来运行。- 由于
linux
默认会把~/bin
目录设置到$PATH
内。此时,若shell.sh
在~/bin
内且具有rx
的权限,那就直接输入shell.sh
即可运行该脚本程序。
- 由于
编写第一个Shell Script脚本
#################定义脚本#######################
[root@RHEL7-2 ~]# vim test.sh
#!/bin/bash
# 第一行声明该文件的shell语法,文件运行时,能够加载bash的相关环境配置文件.bashrc
cd scripts
touch sh01.sh
echo "#!/bin/bash" > sh01.sh
echo "date" >> sh01.sh
chmod u+x sh01.sh
./sh01.sh
##############执行脚本###########################
[root@RHEL7-1 scripts]# sh test.sh
Hello World!
[root@RHEL7-1 scripts]# ./test.sh
-bash: ./test.sh: 权限不够
[root@RHEL7-1 scripts]# chmod u+x test.sh
[root@RHEL7-1 scripts]# ./test.sh
Hello World!
变量定义与使用
[root@RHEL7-1 ~]# your_name="qinjx"
[root@RHEL7-1 ~]# echo $your_name
[root@RHEL7-1 ~]# echo ${your_name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。
对话式脚本
使用read
命令可以让用户输入相应内容,脚本中通过变量进行接收,标准输入读取单行数据。
语法: read [-ers] [-n number] [-p prompt] [-t timeout] [name ...]
参数说明:
-p 后面跟提示信息,即在输入前打印提示信息。
-e 在输入的时候可以使用命令补全功能。
-n 后跟一个数字,定义输入文本的长度。
-r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个正常的字符了。
-s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。
-t 后面跟秒数,定义输入字符的等待时间。
使用echo命令
输出内容,并做相应处理。
参数说明: echo [-neE] [arg ...]
-n 输出字符串不换行
-E 禁用转义解释
-e 处理某些特殊字: \n 换行 \t 水平tab \f 换行,光标停在原处
模拟Linux字符界面的登录效果
#! /bin/bash
clear
read -p "用户名:" logName
read -s -p "密码:" logPwd
echo "你输入的用户名为:${logName} 密码为:${logPwd}"
exit 0
数值运算
利用$(( 计算式 ))
或者 $[ 计算式 ]
来进行数值运算。数值运算有:+
、-
、*
、/
、%
、**
。
#!/bin/bash
echo -e "请输入两个数值:"
read -p "num1:" num1
read -p "num2:" num2
total=$(( num1 + num2 )) # total=$[ num1 + num2 ] 注意等号两边不能有空格
echo "两数相加的结果为:$total"
###############执行####################
[root@RHEL7-1 scripts]# sh sh03.sh
请输入两个数值:
num1:1
num2:2
两数相加的结果为:3
输入3个正整数,计算它们之间的和
输入一个3位的正整数,计算每位数相加之和
小数处理:使用bc工具echo "1.5*10" | bc | cut -d "." -f1
Shell 默认变量
$# | 传递到脚本的参数个数 | $! | 后台运行的最后一个进程ID号 |
---|---|---|---|
$* /$@ | 以一个单字符串显示所有向脚本传递的参数 | $$ | 脚本运行的当前进程ID号 |
$n | n 是数值,用于获取参数值,$1 表示获取第一个参数 | $? | 显示最后命令的退出状态,0表示没有错误,其它值表示有错误 |
#/bin/bash
echo "当前脚本的名字:$0"
echo "第1个数值:$1"
echo "总共输入的参数个数:$#"
echo "参数列表为:$*"
echo "参数列表为:$@"
echo "当前进程号:$$"
###############执行####################
[root@RHEL7-1 scripts]# sh sh04.sh 1 2 3 4
当前脚本的名字:sh04.sh
第1个数值:1
总共输入的参数个数:4
参数列表为:1 2 3 4
参数列表为:1 2 3 4
当前进程号:10150
判断式
test
命令的测试功能
test 命令
用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。man test
数值测试
参数 | 说明 | 参数 | 说明 |
---|---|---|---|
-eq | 等于则为真 | -ge | 大于等于则为真 |
-ne | 不等于则为真 | -lt | 小于则为真 |
-gt | 大于则为真 | -le | 小于等于则为真 |
[root@RHEL7-1 scripts]# num1=1
[root@RHEL7-1 scripts]# num2=2
[root@RHEL7-1 scripts]# test $num1 -eq $num2
[root@RHEL7-1 scripts]# echo $?
1
输入一个数,判断它是奇数还是偶数
字符串测试
参数 | 说明 | 参数 | 说明 |
---|---|---|---|
= | 等于则为真 | -z 字符串 | 字符串的长度为零则为真 |
!= | 不相等则为真 | -n 字符串 | 字符串的长度不为零则为真 |
[root@RHEL7-1 scripts]# str1="Hello"
[root@RHEL7-1 scripts]# str2="Hello"
[root@RHEL7-1 scripts]# test $str1=$str2
[root@RHEL7-1 scripts]# echo $?
0
[root@RHEL7-1 scripts]# test -z $str1;echo $?
1
[root@RHEL7-1 scripts]# test -n $str1;echo $?
0
文件测试
参数 | 说明 | 参数 | 说明 |
---|---|---|---|
-e 文件名 | 如果文件或文件夹存在则为真 | -r 文件名 | 如果文件存在且可读则为真 |
-d 文件名 | 如果文件夹存在则为真 | -w 文件名 | 如果文件存在且可写则为真 |
-f 文件名 | 如果文件存在则为真 | -x 文件名 | 如果文件存在且可执行则为真 |
-s 文件名 | 如果文件为非空白文件则为真 |
[root@RHEL7-1 scripts]# test -e /root/scripts/sh01.sh ; echo $?
0
[root@RHEL7-1 scripts]# test -e /root/scripts ; echo $?
0
[root@RHEL7-1 scripts]# test -f /root/scripts ; echo $?
1
[root@RHEL7-1 scripts]# test -d /root/scripts ; echo $?
0
多重条件判断
参数 | 说明 | 参数 | 说明 | 参数 | 说明 |
---|---|---|---|---|---|
-a | and ,两个条件同时成立则为真 | -o | or ,两个条件任何一个成立则为真 | ! | 取反,真为假,假为真 |
[root@RHEL7-1 scripts]# test -r sh02.sh -a -x sh02.sh ; echo $?
1
判断符号[]
除了使用test
之外,还可以利用判断符号[]
来进行数据的判断。不过有几个注意事项:
- 在中括号内的每个组件都需要有空格键来分隔,包括中括号内前后。
- 在中括号内的变量,最好都以双引号括起来。
- 在中括号内的常数,最好都以单或双引号括起来。
- 在中括号内的的等于符号可以使用
=
或者==
,最好是使用双等号,一个等号有变量设置的意思。
[root@RHEL7-1 scripts]# name="Tom cat"
[root@RHEL7-1 scripts]# [ $name == "Tom cat" ]; echo $?
-bash: [: 参数太多
2
[root@RHEL7-1 scripts]# [ "$name" == "Tom cat" ]; echo $?
0
[root@RHEL7-1 scripts]# [ -z "$HOME" ]; echo $?
1
#!/bin/bash
read -p "请输入(Y/N):" arg
[ "$arg" == "Y" -o "$arg" == "y" ] && echo "OK" && exit 0
[ "$arg" == "N" -o "$arg" == "n" ] && echo "Quit" && exit 0
echo "输入内容不符合" && exit 0
###############执行####################
[root@RHEL7-1 scripts]# sh sh05.sh
请输入(Y/N):y
OK
[root@RHEL7-1 scripts]# sh sh05.sh
请输入(Y/N):n
Quit
[root@RHEL7-1 scripts]# sh sh05.sh
请输入(Y/N):a
输入内容不符合
判断式扩展
测试表达式符号 | test | [ ... ] | [[ ... ]] 字符串的升级 | ((...)) 数字的升级 |
---|---|---|---|---|
边界是否需要空格 | 需要 | 需要 | 需要 | 不需要 |
逻辑操作符 | ! 、-a 、-o | ! 、-a 、-o | ! 、&& 、|| | ! 、&& 、|| |
整数比较操作符 | -eq 、-gt 、-lt 、-ge 、-le | -eq 、-gt 、-lt 、-ge 、-le | -eq 、-gt 、-lt 、-ge 、-le = 、> 、< 、>= 、<= | == 、> 、< 、>= 、<= |
字符串比较操作符 | = 、== 、!= | = 、== 、!= | = 、== 、!= | = 、== 、!= |
是否支持数学运算 | 不支持,需借助数值运算 | 不支持,需借助数值运算 | 不支持,需借助数值运算 | 支持 |
#!/bin/bash
num1=1
num2=1
[[ hello1 == hello? ]] && echo "匹配" || echo "不匹配" # 匹配
((num1==num2)) && echo "相等" || echo "不相等" # 相等
((num3=num1+num2))
((num3+=2))
echo $num3 # 6
程序结构
if...then
语句
if...then
是最常见的条件判断式,简单地说,就是当符合某个条件判断的时候,进行某项工作。if...then
的判断还有多层次的情况。
if [ 条件判断式 ] ; then
当条件判断式成立时,进行命令工作内容
fi
#!/bin/bash
read -p "请输入(Y/N):" arg
if [ "$arg" == "Y" -o "$arg" == "y" ] ; then
echo "OK"
exit 0
fi
if [ "$arg" == "N" ] || [ "$arg" == "n" ] ; then
echo "Quit"
exit 0
fi
echo "输入内容不符合" && exit 0
多重、复杂条件判断式
在同一个数据的判断中,如果该数据需要进行多种不同的判断,则可以使用多重判断,即一个判断条件,分成功进行与失败进行。
if [ 条件判断式1 ]; then
当条件判断式1成立执行
elif [ 条件判断式2 ]; then
当条件判断式2成立执行
else
当条件判断式1和条件判断式2都不成立时执行
fi
#!/bin/bash
read -p "请输入(Y/N):" arg
if [ "$arg" == "Y" -o "$arg" == "y" ] ; then
echo "OK"
elif [ "$arg" == "N" ] || [ "$arg" == "n" ] ; then
echo "Quit"
else
echo "输入内容不合法"
fi
while
不定循环
while
的中文是 当....时
,所以,这种方式说的是“当condition
条件成立时,就进行循环,直到condition
的条件不成立才停止”的意思。
while [ condition ] # 中括号内的状态就是判断式
do # 是循环的开始!
程序段落
done # done是循环的结束
#!/bin/bash
while [ "$arg" != "yes" -a "$arg" != "YES" ] ; do
read -p "请输入 yes/YES 停止循环:" arg
done
echo "程序终止!"
################执行程序###########################
[root@node scripts]# sh sh08.sh
请输入 yes/YES 停止循环:y
请输入 yes/YES 停止循环:s
请输入 yes/YES 停止循环:yes
程序终止!
for 固定循环
while
的循环方式必须要符合某个条件的状态,而for
这种语法则是已经知道要进行几次循环的状态。
for var in con1 con2 con3 ...
do
程序段
done
#!/bin/bash
for N in 1 2 3
do
echo $N
done
#!/bin/bash
for ((i = 0; i <= 5; i++)); do
echo " welcome $i number ~"
done
for i in `seq 0 4`;do echo $i;done # 0 1 2 3 4
for i in $(seq 0 4); do echo $i;done # 0 1 2 3 4
for i in `seq 9 -1 0`;do echo $i;dnoe # 9 8 7 6 5 4 3 2 1 0
for i in {1..4};do echo $i;done # 1 2 3 4
echo $(pwd) # /root/scripts
````与
$()
效果一样,都是用于执行shell命令
获取执行结果。
循环控制
sleep
休眠多少秒break
终止循环contiune
跳出本次循环