英文: change directory
命令路径 :内部命令
执行权限:所有用户
cd:切换工作目录
cd -:回到上一次操作位置
cd ~:回到用户家目录
cd ./:当前目录
cd …/:回到上一级目录
cd :回到家目录
查看目录: ls+选项+目录名
英文:list
命令路径: /bin/ls
执行权限: 所有用户
ll 等价于 ls -l
-l:列表形式显示
-a:所有文件或目录包括隐藏的
eg: ll -a
-h:以可读的方式显示文件大小 配合 -l 使用
eg: ll -a -h
英文:print working directory
命令路径:/bin/pwd
执行权限:所有用户
作用:显示当前工作目录
绝对路径:以根目录开始的路径
相对路径:相对当前目论的路径
语法:pwd [-LP]
eg: cd /usr/local
pwd
英文:make directories
命令路径:/bin/mkdir
执行权限:所有用户
作用:创建新目录
语法:mkdir [-p] 目录名
-p 父目录不存在的情况下生成父目录(parent)
eg: mldir linux/test
如果linux目录不存在,报错。
如果使用参数-p则自动创建该目录
显示或设置系统时期
查看系统时间直接用date命令
以自定义方式显示系统时间:
设置时间
eg: date -s "2020-1-8 15:40:00"
同步到bios重启之后生效
eg: hwclock -w
命令路径:/bin/touch
执行权限:所有用户
作用:创建空文件或更新已存在文件的时间
语法:touch 文件名
eg: touch a.txt b.txt
touch{a.txt,b.txt}
同时创建多个文件({}中不能有空格)
eg: touch "program file"
创建带空格的文件
注意:生产环境中文件名一定不能加空格
命令路径:/bin/echo
执行权限:所有用户
作用:查看某些环境变量/给文件增加内容
语法:echo ‘字符串’ >文件名
eg:echo $PWD 查看当前路径
eg:echo ‘haha’ > test.txt
将字符串添加到test文件中【会将文件覆盖】
eg:echo ‘haha’ >> test.txt
将字符串添加到test文件中【不会将文件覆盖】
英文:copy
命令路径:/bin/copy
执行权限:所有用户
作用:复制文件或目录,文件或目录改名
语法:cp [-rp] 源文件或目录 目的目录
-r -R recursive 递归处理,复制目录
-p 保留文件属性(源文件时间不变)
eg: cp a.txt /root/bdir/aa.txt
eg:cp -r /root/bdir adir
英文:move
命令路径:/bin/move
执行权限:所有用户
作用:移动文件或目录,文件或目录改名
语法:mv 源文件或目录 目的目录
英文:remove
命令路径:/bin/remove
执行权限:所有用户
作用:删除文件
语法:rm [-rf] 文件或目录
-r (recursive)删除目录,同时删除该目录下的所有文件
-f(force)强制删除文件或目录,即使源文件属性设置为只读,直接删除无需确认
vim/v是Unix/Linux上最常用的文本编辑器
只有命令,没有菜单
vim工作模式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UczrYkWI-1580959511947)(C:\Users\NOBODY\AppData\Roaming\Typora\typora-user-images\1579341380339.png)]
命令模式:又称一般模式
编辑模式:又称底行模式、命令行模式
:wq! w:保存 q:退出 !:强制
命令 | 作用 |
---|---|
a | 在光标后附加文本 |
A(shift+a) | 在本行行末附加文本 行属 |
i | 在光标前插入文本 |
I(shift+i) | 在文本行开始插入文本 行首 |
o | 在光标下插入新行 |
O(shift+o) | 在光标上插入新行 |
命令 | 作用 |
---|---|
:set nu | 设置行号 |
:set nonu | 取消行号 |
gg G | 到第一行 到最后一行 |
nG | 到第n行 |
:n | 到第n行 |
命令 | 作用 |
---|---|
:w | 保存修改 |
:w new_filename | 另存为指定文件,如果不存在则创建新文件 |
:w >> a.txt | 追加内容到a.txt,文件必须存在 |
:wq | 保存修改并退出 |
shift+zz (ZZ) | 快捷键 保存修改并退出 |
:q! | 不保存修改退出 |
:wq! | 保存修改并退出(忽略只读属性) |
命令 | 作用 |
---|---|
x | 删除光标处所在字符 nx删除光标所在处后n个字符 |
dd | 删除光标所在行,ndd删除n行 |
:n1,n2d | 删除指定范围的行(eg:1,3d 删除123三行) |
dG | 删除光标所在行到末尾的内容 |
D | 删除光标所在处到行尾 |
命令 | 作用 |
---|---|
yy、Y | 复制当前行 |
nyy、nY | 复制当前行一下n行 |
dd | 剪切当前行 |
ndd | 剪切当前行一下n行 |
p、P | 粘贴在当前光标所在行下 或行上 |
命令 | 作用 |
---|---|
r | 取代光标所在处字符 |
R | 从光标所在处开始替换字符,按esc结束 |
u | undo 取消上一步操作 |
ctrl+r | redo 返回到undo之前 |
命令 | 作用 |
---|---|
/string | 向后搜索指定字符串 |
?string | 向前搜索指定字符串 |
n | 搜索字符串的下一个出现位置,与搜索顺序相同 |
N | 搜索字符串的上一个出现位置,与搜索顺序相反 |
:%s/old/new/g | 全文替换指定字符串 |
:n1,n2s/old/new/g | 在一定范围内替换指定字符串 |
注意:
遇到特殊字符时,需要进行转义字符处理
如: . 写成 \.
* 写成 \*
^ 写成 \^
% 指定全文,s指开始,g指全局替换
起始行,终止行s/要替换的字符串/替换新的字符串/g c询问确认
eg: :%s/ftp/young/g 全局替换ftp为young
eg: :4,7/ftp/young/c 从4-7行,把ftp替换为young,询问是否替换
:%s/^/#/g 来在全部内容的首行添加#号注释 ^表示首行
:1,10 s/^/#/g 在1-10行首添加#号注释
vi 里面查看命令: :! which cp
vi 里面导入命令的结果 : :r !which cp
I或O进入插入模式
英文:concatenate
命令路径:/bin/cat
执行权限:所有用户
语法:cat [-n] [文件名]
-A 显示所有内容,包括隐藏的字符
-n 显示行号
eg: cat/etc/service
命令路径:/bin/more
执行权限:所有用户
作用:分页显示文件内容
语法:more [文件名]
空格 或 f 显示下一页
enter 显示下一行
q 或 Q 退出
命令路径:/usr/bin/head
执行权限:所有用户
作用:查看文件前几行(默认10行)
语法:head [文件名]
-n 指定行数
eg: head -20/etc/services
head -n 3/etc/services
命令路径:/usr/bin/tail
执行权限:所有用户
作用:查看文件后几行(默认10行)
语法:tail [文件名]
-n 指定行数
获取一个大文件的部分文件,可以使用head或tail命令
eg: head -n 100 /etc/services >config.log
会直接用services中的前100行覆盖config.log
英文:link
命令路径:/bin/in
执行权限:所有用户
作用:产生链接文件
语法:
In -s [源文件] [目标文件] 创建软链接
源文件使用绝对路径
相当于建立快捷方式
In [源文件] [目标文件] 创建硬链接 相当于深拷贝
eg: In -s /etc/service ./service.soft
创建文件 /etc/service的软链接service.soft
eg: In /etc/service ./service.hard
创建文件 /etc/service的软链接service.hard
软连接类似于win的快捷方式
软连接文件格式:lrwxrwxrwx.1 root root 13 Jul 20 07:50 service->/etc/services
格式解析(特征):
1代表硬链接的数量,如果该文件没有硬链接,就只有本身一个人硬 链接
13代表链接文件的长度
1. 软连接的文件按类型都是l(软连接),软连接文件的权限都是 lrwxrwxrwx
2.->箭头指向到源文件
真正的权限取决于对源文件的权限
时间值为创建软连接的时间
软连接可以跨文件系统生成
硬链接特征
删除软连接
rm -rf symbolic_name
inode说明
Linux文件系统中的inode主要用于存放档案和目录的基本信息,当系统创建文件系统的同时会创建大量的inode
命令路径:/bin/find
执行权限:所有用户
作用:查找文件或目录
语法:find [搜索路径] [匹配条件]
如果没有搜索路径默认从当前路径查找
find 命令选项
-name 按名称查找
说明:精确查找
eg: find /etc -name "init"
在目录/etc中查找init
-iname 按名称查找
说明:不区分大小写
find 查找字符匹配:
*:匹配所有
?:匹配单个字符
eg: find /etc -name "init???"
在目录etc中查找init开头且后面有三位的文件
模糊匹配的条件,建议使用单引号或双引号括起来,如果*被转 义,可使用单引号括住查询条件或者使用 *
*eg: find -name g
-size 按文件大小查找
以block为单位,一个block是512B,1k=2block +大于 -小于 不写为等于
eg:find /etc -size -204800 在该目录下找出小于100mb的文件
-type 按文件类型查找
f 二进制文件 l 软连接文件 d 目录 c 字符文件
eg: find /dev -type c
find 查找的基本原则:
占用最少系统资源,即查找范围最小,查询条件最精准
注意:如果明确知道查找的文件在哪一个目录,就直接对指定目录查找,不查找根目录
命令路径:/bin/grep
执行权限:所有用户
作用:在文件中搜索字符串匹配的行并输出
语法:grep [-cinv] ‘搜索字符串’ filename
选项参数
-c:输出匹配行的次数
-i:忽略大小写
-n:显示匹配行及行号
-v:反向选择,显示不包含匹配文本的所有行
eg: grep ftp /etc/services
eg: grep -v ^# /etc/inittable 去掉文件行首的#号
eg: grep -n “init” /etc/inittable 显示在inittable文件中,init匹配行及行号
eg: grep -c “init” /etc/inittable 显示在inittable文件中,init匹配了多少次
命令路径:/usr/bi/which
执行权限:所有用户
作用:显示系统命令所在目录(绝对路径及别名)
which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。 也就是说,使用which命令就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令
eg:which Is出现 下面的信息.是Is指令的详情,说明ls指令是存在的
alias ls="ls --color=auto’
/bin/ls
eg:which zs出现下面的信息说明zs指令是不存在的
/usr/bin/which: no zs in /usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/ch/bin)
命令路径:/usr/bin/whereis
执行权限:所有用户
作用:搜索命令所在目录 配置文件所在目录及帮助文档路径
eg: which passwd 和 whereis passwd
eg: 查看/et/passwd配置文件的帮助.就用man 5 passwd
英文: GNU zip
命令路径:/bin/gzip
执行权限:所有用户
作用:压缩(解压)文件,压缩文件后缀为 .gz
gzip 只能压缩文件,不能压缩目录,不保留原文件
语法:gzip 文件
-d 将压缩文件解压( decompress )
解压使用gzip -d或者gunzip
命令路径:/usr/bin/bzip2
执行权限:所有用户
作用:压缩(解压)文件文件夹,压缩文件后缀为 .bz2
语法:bzip2 [-k] [文件]
-k:压缩文件后保留原文件(压缩比高)
-d:解压缩的参数( decompress )
解压使用bzip2 -d 或者 bunzip2
命令路径:/usr/bin/zip
执行权限:所有用户
作用:压缩(解压)文件,压缩文件后缀为 .zip,保留源文件
语法:zip 选项[-r] [压缩后文件名称] [文件或目录]
-r 压缩目录
eg:zip services.zip /etc/services压缩文件
zip -r test.zip /test压缩目录
如果不加-r选项,压缩后的文件没有数据。
解压使用 unzip ,注意如果解压时,已经存在与压缩文件同名的目录名,不会进行覆盖
命令路径:/bin/tar
执行权限:所有用户
作用:文件、目录打(解)包
语法:tar [-zcf] 压缩后文件名 文件或目录
-c 建立一个压缩文件的参数指令( create ), 后缀是 .tar
-x 解开一个压缩文件的参数指令( extract )
-z 以gzip命令压缩/解压缩
-j 以bzip2命令压缩/解压缩
-v 压缩的过程中显示文件( verbose )
-f file指定文件名,必选项
tar-cf tar-xf 单独的打包、解包
gzip bzip2 打包之后,进行压缩
tar -zcvf tar-zxvf 一步到位
tar -z 以 gzip 打包目录并压缩文件格式tar.gz (.tgz)
tar -j 以 bzip2 打包目录并压缩文件格式tar,bz2
eg:tar -zcvf dir1.tar.gz dir1 使用gzip将目录dir1压缩成一个打包并压缩文件 dir1.tar.gz
eg:tar -zxvf dir1.tar.gz -C(大写的) /root 解压到指定的 /root目录
eg:tar -cvf bak.tar . ,将当前目录的文件打包为 bak.tar
eg:tar -xvPfbak.tar 解压到当前目录默认是相对路径 P 意思是支持绝对路径
eg:tar -cvPf bak.tar /a/b将 /a/b 路径压缩成bak.tar
eg:tar -zcvf bak.tar.gz bak.tar 或gzip bak.tar使用gziρ将打包文件bak.tar压缩为bak.tar.gz
eg:tar jcvf bak.tar.bz2 bak.tar 或bzip2 bak.tar使用bzip2将打包文件bak.tar压缩为bak.tar.bz2
eg:tar -rvf bak.tar /etc/password将/etc/password追加文件到bak.tar中
eg:tar -Cjvf testtar.bz2 test 生成test.tar.bz2的压缩文件
选项:
-c:取消前一个关机命令
-h:关机
-r:重启
eg:
shutdown -h now 立即关机
shutdown -h 20:30 定时关机
其他关机命令 halt
poweroff
init 0
eg:
reboot 重启系统
reboot -h now 立即重启
注意:生产环境中,关机命令和重启命令谨慎执行。
uname -r 查看系统版本信息
basename a/b/c/test.txt 显示:test.txt查看命令中的名字
dirname a/b/c/test.txt 显示:a/b/c/查看命令中的路径
切换执行命令
Linux 其中执行等级
init 0:关机
init 3:纯文本模式
init 6:重新启动
善于查看man help等帮助文档
利用好Tab键自动补全
掌握好一些快捷键
ctrl+c (停止当前进程)
ctrl+z 挂起当前进程,放后台
fg:将已挂起的或在后台运行的进程调入前台运行
bg:将已挂起的进程调入后台运行
ctrl+r (查看命令历史) historyl
ctrl+l (清屏,与clear命令作用相同)
对当前命令行的操作:
方向箭头上下可以查看执行过的命令并再次使用
ctrl+a 行首
ctrl+e 行尾
ctrl+d 清除当前的字符
ctrl+k 清除光标后面的内容
ctrl+w 清除光标前面的单词
小技巧: linux 不进去系统更改root密码
1.开机时按'e'键进 grub
2.在grub选项菜单按e进入编辑模式
3.编辑kerne1那行输入" 1"(空格1 ) ,然后按enter键。
4.按b重启
5.进入后执行下列命令
passwd root
passwd root (配置root的密码)-->Enter new unix password:输入新的密码-->init 6
root把本来只能超级用户执行的命令赋予给普通用户执行
sudo的操作命令对象是系统命令
执行visudo这里 实际修改的是/etc/sudoers文件
sudoers文件内部的信息解释
root ALL=(ALL) ALL #用户名被管理主机的地址(不是访问地址)= (可使用的身份)授权命令(绝对路径)
%wheel ALL=(ALL) ALL #%组名被管理主机的地址= (可使用的身份)授权命令 (绝对路径)
#sudo -l 查看可用的sudo命令
注意:
sudo命令用来以其他身份来执行命令,预设的身份为root。
在/etc/sudoers中设置了 可执行sudo指令的用户。
若其未经授权的用户企图使用sudo ,则会发出警告的部件给管理员。
用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。
sudo[选项] (参数)
选项
-b:在后台执行指令
-h:显示帮助
-H:将HOME环境变量设为新身份的HOME环境
-k:结束密码的有效期限,也就是下次再执行sudo时便需要输入密码
-l:列出目前用户可执行与无法执行的指令
-p:改变询问密码的提示符号
-s:执行指定的shell
-u<用户>:以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份
-v:延长密码有效期限5分钟
-V :显示版本信息
1 配置sudo必须通过编辑/etc/sudoers文件,而且只有超级用户才可以修改它,还必须使用visudo编辑。
2 之所以使用visudo有两个原因
一是它能够防止两个用户同时修改它
二是它也能进行有限的语法检查
3 所以,即使只有你一个超级用户,你也最好用visudo来检查一下语法。 visudo默认的是在vi里打开配置文件,用vi来修改文件。我们可以在编译时修改默认项。
4 visudo不会擅自保存带有语法错误的配置文件,它会提示你出现的问题,并洵问该如何处理,错误提示:
sudoers file:syntax errorline 22<<
此时我们有三种选择:
键入"e"是重新编辑
键入"x"是不保存退出
键入“Q”是退出并保存。如果真选择Q,那么sudo将不会再运行,直到错误被纠正。
让用户hd1可以通过sudo执行所有root可执行的命令。以root身份用visudo打开配置文件.可以看到类似下面几行:
Runas alias specification
User prvilege specificationroot ALL=(ALL)ALL
这里root有所有权限,只要仿照现有root的例子就行。我们在下面加一行(最好用tab作为空白)
hd1 ALL=(ALL) ALL
第一个ALL是指网络中的主机,它指明hd1可以在此主机上执行后面的命令。
第二个括号里的ALL是指目标用户,也就是以谁的身份去执行命令,通常我们指定为al1即可,
最后一个ALL当然就是指命令名了。
保存退出后,切换到hd1用户,我们用它的身份执行命令;
sudo Is /root在Is前面添加sudo可以让hd1拥有roo的权限查看root目录
我们限制一下hd1的权利。比如我们只想让他像root那样使用 Is 和ifconfig ,继续修改sudoers文件
hd1 ALL= /sbin/ifconfig, /bin/s, /usr/bin/sudo
再次切换到hd1用户,执行命令:
sudo head -5 /etc/shadow 这是提示hd1没有权限执行这个命令.
我们这样再添加一行配置文件
hd1 ALL=NOPASSWD: /bin/cat/ls, /usr/bin/sudo
再来sudo一下:不再需要密码
说明: (以网络方式为NAT示例)
1.dhcp分配
2.图形化界面
3.使用命令行修改配置文件
vi /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO-static static 静态ip dhcp 动态ip none 不设置默认静态ip
ONBOOT=yes/no 是否开机自动使用
nm. controlled-yes设置network manager的参数实时生效修改后无需要重启网卡立即生效。建议删掉
IPADDR=192.168.2.129
UUID建议去掉
HWADDR建议去掉
NETMASK-255.255.255.0或者PREFIX=24
GATEWAY=192.168.2.2 #网段2任意 , IP地址2固定,网段为vmnet8的设置的IP网段
DNS1=114.114.114.114国内的DNS
DNS2=8.8.8.8谷歌的DNS
defroute-yes默认的路由建议删掉
IPV4_ FAILURE. FATALayes如果为yes ,则ipv4配置失败禁用设备建议删掉
3.重启网络生效: service network restart
1.及时生效重启后复原
eg: 关闭:service iptables stop
eg: 开启:service iptalbes start
eg: 查看状态:service iptables status(关闭状态的话会提示firewal is not running)
eg: 关闭:chkconfig iptbales off
eg: 开启:chkconfig iptables on
eg: 查看状态:chkconfig iptables --list
注意:如果ifcfg- eth0中的nm. contolld设置成no或者删掉了.NetworkManger就没有了.
eg: 启动: service NetworkManager start
eg: 临时关闭: service NetworkManager stop
eg: 开机启动: chkconfig NetworkManager on
eg: 禁用开机启动: chkconfig NetworkManager off
eg: 检查networkmanager服务是否已经正常开启: chkconfig | grep networkmanager
eg: 删除networkmanager :chkconfig NetworkManager -del
命令路径: /bin/ping
执行权限: 所有用户
作用: 测试网络的连通性
语法: ping选项IP地址
-c 指定发送次数
ping命令使用的是icmp协议,不占用端口
eg: ping-c 3127.0.0.1
英文: interface configure
命令路径: /sbin/ifconfig
执行权限: root
作用: 查看和设置网卡网络配置
语法: ifconfg [-a] [网卡设备标识]
-a: 显示所有网卡信息
ifconfig网卡名字查看单个的网卡信息
英文: network statistics
命令路径: /bin/netstat
执行权限:所有用户
作用:主要用于检测主机的网络配置和状况
-a (all)显示所有连接和监听端口
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 使用数字方式显示地址和端口号
-p 显示socket的PID和进程的名字
-l (listening)显示监控中的服务器的socket
eg: netstat -tlnu查看 本机监听的端口
eg: tcp 000.0.0.0:111 0.0.0.0:* LISTEN
协议待收数据包待发送数据包本地ip地址:端口远程IP地址:端口
netstat -antpl
eg: netstat -ntlp I grep httpd查看其某一个程序的端口信息
eg: netstat -atnp I grep httpd
临时生效:
hostname主机名
注意:通过调用logout先退出.再登录-写入内存
永久生效:修改配置文件
vim /etc/sysconfig/network
修改主机名和ip地址之间的映射关系
执行vim /etc/hosts进入hosts文件,加入代码
主机ip 主机名
192.168.2.120 master
作用: 用于查看Linux文件系统的状态信息显示各个分区的容量、已使用量、未使用量及挂载点等信息。看剩余空间
语法: df [-hkam] [挂载点]
-h ( human-readable )根据碰盘空间和使用情况以易读的方式显示KB,MB.GB等
-k 以KB为单位显示各分区的信息,默认
-m 以MB为单位显示信息
-a 显示所有分区包括大小为0的分区
作用: 用于查看文件或目录的大小(磁盘使用空间)
语法: du [-ahs]文件名目录]
-a 显示子文件的大小
-h 以易读的方式显示KB.MB.GB等
-s summarize统计总占有量
eg: du -a (all) /home 显示/home 目录下每个子文件的大小,默认单位为kb
eg: du -h /home以K , M,G为单位显示/home文件夹下各个子目录的大小
eg: du -sh /home以常用单位 ( K.M.G )为单位显示home目录的总大
小-s summarize
df 命令和 du 命令的区别:
df 命令是从文件系统考虑的,不仅考虑文件占用的空间,还要统计被命令或者程序占用的空间。
du 命令面向文件,只计算文件或目录占用的空间。
eg: 执行下面的命令查看区别
df -h /
du -sh /
作用:查看内存及交换空间使用状态
语法: free [-kmg]
选项:
k: 以KB为单位显示,默认就是以KB为单位显示
m: 以MB为单位显示
g: 以GB为单位显示
清理缓存命令:
echo 1 > /proc/sys/vm/drop_caches
语法: su 用户名
作用: 切换用户
eg: su root 切换回 root用户,注意: 如果是root用户,每次都会要求输
入密码,普通的用户可以直接切换
添加用户
语法: useradd [选项]用户名
19.3 passwd
语法: passwd [选项] [用户名]
用户密码: 生产环境中,用户密码长度8位以上,设置大小写加数字加特殊字符,要定期更换密码。
ys^h_L9t
删除用户
-r 删除账号时同时删除宿主目录( remove )
注意: 一个用户已经打开,需要删除
做法: 先跳到当前用户下面,执行exit或exit用户名。这时会自动跳回root界面。
如果还是无法删除,可以将系统重启
用于添加组
-g 指定 gid
用于修改组
-n 更改组名(new group )
groupmod -n new_ gname old_gname
用于删除组
如果要删除的组归属于某一个用户的所属组,则不能删除该组
useradd -g hadoop hdfs
groupdel hadoop
程序是静态概念,本身作为一种软件资源长期保存;而进程是程序的执行过程,它是动态概念.有一定的生命期,是动态产生和消亡的。
程序和进程无一一对应关系。一个进程在活动中可有顺序地执行若干个程序。
子进程是由一个进程所产生的进程,产生这个子进程的进程称为父进程。
在Linux系统中,使用系统调用 fork 创建进程。fork 复制的内容包括父进程的数据和堆栈段以及父进程的进程环境。
父进程终止子进程自然终止。
进程:就是正在执行的程序或命令,每一个进程都是一个运行的实体 ,都有自己的地址空间,并占用-一定的系统资源。
线程:轻量级的进程;进程有独立的地址空间,线程没有;线程不能独立存在,它由进程创建;相对讲,线程耗费的cpu和内存要小于进程。
进程管理的作用:判断服务器的健康状态:查看系统所有的进程:杀死进程.
前台进程:
在Shell提示处打入命令后,创建一个子进程,运行命令, Shell 等待命令退出,然后返回到对用户给出提示符。这条命令与 Shell 异步运行,即在前台运行,用户在它完成之前不能执行另一个命令。
后台进程:
在 Shell 提示处打入命令,若后随一个& , Shell创建的子进程运行此命令,但不等待命令退出,而直接返回到对用户给出提示。这条命令与hel同步运行,即在后台运行。后台进程必须是非交互式的。
作用: 查看系统中的进程信息
语法: ps [-auxle]
常用选项
a:显示所有用户的进程
u:显示用户名和启动时间
x:显示没有控制终端的进程
e:显示所有进程,包括没有控制终端的进程
l:长格式显示
ps aux #查看 系统中所有进程,使用BSD操作系统格式, unix
ps-le #查看系统中所有进程,使用Linux标准命令格式
eg:ps -u or ps -l 查看隶属于自己进程详细信息
eg:ps aux | grep root 查看用户root执行的进程
eg:ps -ef | grep init 查看指定进程信息
作用:查看当前进程树
语法: pstree [选项]
-p 显示进程PID
-u 显示进程的所属用户
作用:查看系统健康状态
显示当前系统中耗费资源最多的进程,以及系统的一些负载情况。
请法: top [选项]
-d 秒数,指定几秒刷新一次,默认3秒(动态显示)
作用:关闭进程
语法: kill [-选项] pld
eg:kill -9进程号(强行关闭)常用
eg:ill-1进程号(重启进程)
eg:killall -l 关闭所有进程(忽略进程名的大小写)
作用:查看用户信息
语法:w 用户名
eg: w root
显示:
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 :0 16:13 5:53m 8.07s 8.07s /usr/bin/Xorg :0 -br -verbose -audit 4
root pts/0 192.168.202.1 21:14 0.00s 0.03s 0.00s w root
root pts/1 192.168.202.1 21:14 47:19 5.51s 5.50s top
解释:
JCPU:以终端代号来区分,该终端所有相关的进程执行时,所消耗的
CPU时间会显示在这里
PCPU: CPU执行程序耗费的时间
WHAT :用户正在执行的操作
作用:使进程在用户退出登陆后仍旧继续执行,nohup命令将执行后的数据信息和错误信息默认储存到文件nohup.out中
语法: nohup program& &在后台运行的意思
eg: nohup ping www.baidu.com &
使用ps -ef | grep ping查看当前的ping进程
作用:查看负载
例如:使用uptime确定是服务器还是网络出了问题。如果网络应用程序运行,运行uptime来了解系统负载是否很高。如果负载不高。这个问题很有可能是由于网络引起的而非服务器。
语法: uptime
eg:执行: uptime
显示22:15:09 up 6:06, 3 users, load average: 0.00, 0.04, 0.11
解释:系统时间
用户数量服务器在过去的1分钟、 5分钟、15分钟的系统平均负载值
r 读权限( read )
w 写权限( write )
x 执行权限( execute )
所有者 所属组 其他人
第1位:文件类型(d目录,- 普通文件,I 链接文件)
第2-4位:所属用户(所有者)权限,用u (user)表示
第5-7位:所属组权限,用g ( group)表示
第8-10位:其他用户(其他人)权限,用o ( other)表示
第2-10位:表示所有的权限,用a(all)表示
eg:drwxr-xr-x. 2 root root 4096 Jan 20 18:51 下载
第十一位的1代表硬链接数
字符 | 权限 | 对文件的含义 | 对目录的含义 |
---|---|---|---|
r | 读权限 | 可以查看文件内容 | 可以列出目录的内容 |
w | 写权限 | 可以修改文件内容 | 可以在目录中删除创建文件 |
x | 执行权限 | 可以执行文件 | 可以进入目录 |
对于文件,我们有执行权限的命令:
r-cat,more,head,tail,less
w-echo.vi
x- 命令,脚本
对于目录我们有执行权限的命令:
r-ls
w-touch,mkdir,rm,rmdir
x-cd
能删除文件的权限是必须对该文件所在的目录有 wx 权限
用于权限更改
英文: change mode (change the permissions mode of a fle)
作用:改变文件或目录权限
语法:
chmod [{ugoa}{±=}{rwx}] [文件名或目录]
chmod [mode=421] [文件或目录]
参数: -R 下面的文件和子目录做相同权限操作( Recursive递归的)
可以有修改一个文件的权限:
1.root
2.文件所有者
eg: chmod u+x a.tt
eg: chmod u+x,0-x a.bxt
用数字来表示权限(r=4, w=2.x=1 ,=0)
eg: chmod 750 b.txt
rwx和数字表示方式能随意切换
注意: root用户是超级用户,不管有没有权限, root都能进行更改。用普通用户测试权限。
不能用一个普通用户去修改另一个普通用户的权限。
用于更改所有者
英文:change file ownership
作用:更改文件或者目录的所有者
语法:chown user[:group] fle…
-R:递归修改
参数格式: user :新的档案拥有者的使用者ID
group:新的档案拥有者的使用者群体(group)
eg:chown lee file1把file1文件的所有者改为用户lee
eg:chown lee:test file1把file1文件的所有者改为用户lee.所属组改为test
eg:chown -R lee:test dir修改dir及其子目 录的所有者和所属组
用于改变所属组
英文: change file group ownership
作用:改变文件或目录的所属组
语法:chgrp [group] fle…
eg: chgrp root testlog把testlog的所属组修改为root
学软件开发,各种台的软件熟练安装是必须要熟练掌握。大家都知道, Windows下安装软件时,只需用鼠标双击软件的安装程序,或者用Zip等解压缩软件解压缩即可安装;在android或者apple中安装软件时,只需要在手机应用商店点击安装即可。而在Linux 下安装软件难度高于Windows. Android. ios和windows phone下软件安装。
下面我就详细讲解Linux下如何安装软件。
Linux下软件的安装大概可以分为如下几种:
二进制程序的安装(最简单安装)
rpm程序安装(后缀名为*.rpm)
yum源安装(本质也是rpm安装,它只是rpm的一种安装方式而已)
源码安装
Linux下二进制格式的软件是指事先已经在各种平台编译安装好相关软件,然后压缩打包,在安装时只需解压或者执行安装可执行文件即可。这种软件发行格式类似与windows系统。这样做的原因是保护源代码程序不对外泄露,保护知识产权。二进制软件包的优点是安装简单、容易缺点是缺乏灵活性,相应的软件包执行在对应平台下安装,离开这个环境软件就无法运行。
二进制软件包提供了很多类型的打包方式,最常见的就是我们上节讲到的RPM格式的包,还有以 " *.tar.gz、 * .tgz、 *.bz2 "等形式的二进制软件包,最后还有一个就是提供安装程序进行安装的二进制软件包。下面分别介绍:
这种格式的软件包.安装实就是简单的解压过程,根据不同的软件打包格式,我们用相应的解压命令解压即可。
对于* .tar.gz软件格式解压: tar -zxvf xxx.tar.gz,对于*bz2软件格式解压: tar. jxvf xxxxx.trgz这类软件的卸载,对于解压后只有单一目录的软件 ,可以直接删除对应软件目录即可,如果解压后文件分散在几个目录中:需要一手动删除目录。
例如:我们常用的应用服务器容器tomcat软件就是基于这种打包压缩格式发行的。我们只需下载后解压即可完成安装,如果需要和载,直接删除对应的tomcat目录即可.
这种软件包都提供了安装脚本或者安装向导程序,只需在下载此类软件包后解压,然后进入安装目录,找到类似的setup. install, insallsh之 类的可执行文件运行即可,然后根据提示(比如安装路径,参数设置等等)进行相应的设置,接着安装就自动完成。
这类软件的卸载也提供了相应的卸载脚本或者卸载向导。根据提示即可完成软件卸载。
例如:经常使用的sun jdk就是这种安装方式,从网络下载下来的jdk是个二进制可执行文件,首先设置文件的可执行权限(例chmod 755 jdk1.6.0 07.bin,权限操作本书后面会有详细讲述) , 然后运行软件(也即是,1jdk1.6.0 _07.bin) 即可完成安装。安装完成会在当前目录产生一个对应的jdk程序目录。
RPM软件包管理
RPM软件包也称为二进制软件包
RPM是RedHat Package Manager ( RedHat软件包管理工具)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括RedHat,CentOS,SUSE等Linux的发行版本都有采用,可以算是公认的行业标准了。RPM文件在Linux系统中的安装最为简便
RPM命令使用
rpm的常用参数
i:安装应用程序(install)
vh:显示安装进度( verbose hash )
U:升级软件包( update )
qa:显示所有已安装软件包( query all )
e:卸载应用程序(erase )
注意:如果其它软件包有依赖关系,卸载时会产生提示信息,可使用–nodeps强行卸载。
查询所有安装的rpm包: rpm -qa
查询mysql相关的包: rpm -qa | grep mysql
安装:rpm -ivh jdk.rpm
卸载: rpm -e mysql*
强行卸载:rpm -e mysql* --nodeps
图形化界面,手动挂载
yum(yellowdog updater modified):软件包管理工具
1.自动解决软件包依赖关系
2.方便的软件包升级
yum list 查询所有可用软件包列表
yum search 关键字 搜索服务器 上所有和关键字相关的包
yum info 关键 字来查找包名
yum -y install 包名 -y 自动回答yes
yum -y update 包名
注意:如果不加包名,就升级所有的.包括内核。必须加包名升级单个软件包,慎用升级所有的检测升级yum check-update
yum -y remove 包名
yum --help、man yum帮助
yum clean all 清除缓存和旧的包
yum repolist 查看当前可用的yum源
yum deplist 包名 列出一个包所有依赖的包
1)自己创建mnt/cdrom文件夹: mkdir /mnt/cdrom
2)相关内容说明
#命令格式:mount [-t vfstype] [-o options] device dir
其中:
#1.-t vfstype 指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。常用类型有:
光盘或光盘镜像: iso9660
DOS fat16文件系统: msdos
Windows 9x fat32文件系统: vfat
Windows NT ntfs文件系统: ntfs
Mount Windows文件网络共享: smbfs
UNIX(LINUX)文件网络共享: nfs
#2.-o options主要用来描述设备或档案的挂接方式。常用的参数有:
loop:用来把一个文件当成硬盘分区挂接上系统
ro:采用只读方式挂接设备
mw:采用读写方式挂接设备
iocharset :指定访问文件系统所用字符集
#3.device要挂接(mount)的设备。
#4.dir设备在系统上的挂接点(mount point)。
#将境像文件挂载在/mnt/cdrom下
mkdir /mnt/cdrom #在根目录 下的mnt目录下创建目录cdrom
mount -t iso9660 -o loop /dev/cdrom /mnt/cdrom ##挂载
umount /mnt/cdrom ##卸载
cd /etc/yum.repos.d/
rename .repo .repo.bak * #重命名所有的.repo文件
cp CentOS-Media.repo.bak CentOS-Media.repo #配置一个.repo文件
cat /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-Sreleasever- Base
mirrorlist=http://mirrorlist.centos.org?release-releasever&arch-basearch&repo=os
baseurl=http://mirror.centos.org/centos/releasever/os/basearch/
gpgcheck=1
gpegkey=file//etc/pk/rpm-gpg/RPM-GPG-KEY-Cent05-6
解释:
[base] 容器名称一定要放在[ ]中
name 容器说明 ,这个可以自己随便写
mirrorlist 镜像站点 ,这个可以注释掉
baseurl yum 源服务 器的地址。默认是CentOS富方的yum源服务器
enabled 此容器是否生效,如果不写或写enable=1都是生效。写成enable=0就是不生效
gpgcheck 如果是1是指RPM的数字证书生效.如果是0则不生效
pggkey 数字证书的公匙文件保存位置不用修改
vi CentOS-Media.repo
[c6-media]
name-CentOS-$releasever - Media
baseurl=file:///mnt/cdrom
#这里的地址为自己光盘挂载地址。并把不存在的地址注释掉在行首注释
#file://media/cdrom/
#file///media/cdrecorder/
gpgcheck=1
enabled=1 #把原来的0改为1 ,让这个yum源配资文件生效
geke-ile://etC/pkirpm-gpg/RPM.GPG-KEY-CentOS-6
可使用yum repolist查看当前可用yum源
yum clean all
yum repolist
进入下面的路径:
vi /etc/udev/rules.d/70-persistent-net.rules
注意:复制硬件地址时可以到虚拟机的高级里面直接拷贝mac地址
Device eth0 does not seem to be present ,delaying的问题,
1 可以继续改虚拟机 mac 地址 uuid
vim /etc/sysconfig/network-scripts/ifcfg-eth0
用复制的硬件地址替换掉ifcfg-ethe中的硬件地址
删除掉UUID那一行或者将uuid中的数字或字母改变一个
(如果删除了UUID那一行,所有配置完成后要重新启动机器)
2 或者将ifcfg-eth0中 mac,uuid 都删掉直接将机器重启也可以
3 或者直接将70-persistent-net.rules删掉重启电脑
#改主机名
hostname主机名
vim /etc/sysconfig/network
#改ip映射
vim /etc/hosts
问题描述:克隆后,修改了 eth0 的 ip 地址但是 ifconfig 后,ip 没有变化
方法:到 network-scripts 下将ifcfg-eh0删掉重启网络
1.更改主机名临时+永久
2.检查网卡是否启动
3.关闭NetworkManager网络管理服务
4.关闭防火墙
5.选择 nat 模式
6.查看vmnet8网关
7.更改虚拟机 ip 地址,网关,DNS
8.更改主机 vmnet8 的ip地址,网关, DNS (为了使用远程连接工具连接虚拟机)
9.虚拟机互相 ping ,进行则试
6)操作新linux系统流程
1.更改主机名临时+永久
2.检查网卡是否启动
3.关闭NetworkManager网络管理服务
4.关团防火墙
5.更改ip地址
6.更改主机名称和主机映射
7.使用连接工具( finalshell )进行连接
8.如果出现问题按照以上流程检查
首先注意:在命令行版本的linux中默认没有scρ命令,需要手动安装
安装命令:yum -y install openssh-clients,而且注意发送和接收命令的主机都要安装
集群模式下。各节点之间如何方便的拷贝文件?
命令格式:
scp file 远程用户名@远程服务器IP:/路径 (注意:冒号和目录之间不能有空格)
如果拷贝目录。需要加-r选项。
使用root用户
eg: scp /etc/profile root@node2:/etc
eg: scp -r /usr/jdk1.8 node2:/usr/java ##根用户可以省略用户名
eg: scp hello.log node2:$PWD
注:使用 $PWD 默认到当前目录。注意: 目标主机要有与当前相同的目录前面的文件或文件夹会直接拷贝到后面的目录中
-:到当前用户的宿主目录
eg:scp /etc/services node2:/root/service.hard ##重命名
可以通过这种方式修改拷贝的文件名。
方便节点间的切换 ssh node2
1)在第一台机器上生成一对钥匙,公匙和私匙kgen
2)当前用户的宿主目录下的 .ssh 目录下多了两个文件
注意:
1. 主机名和ip都可以(确保配置了主机名ip的映射)
2. 如果出现 -bash:ssh-copy-id:command not found,说明ssh-copy-id这个指令没有安装,安装命令:yum -y openssh-clients
还需要输入密码
4)拷贝完成之后,会在免密登录的机器上生成授权密码文件
注意:免密登录是单向的
1.node1使用ssh-keygen -t rsa生成公钥和私钥
2.ssh-copy-id root@node2将公钥拷贝到node2上,实际上是把公钥内容追加到authorized_keys文件中
3.请求时: node1向node2发送连接请求时,附带主机,ip地址等信息
4.node2 收到请求后,去授权文件里查找node1的公钥,找到之后.随机生成一个字符串,并用公钥加密,并发送给node1
5.node1接收到密文之后,用私钥解密,并把解密结果返回给node2
6.node2 拿到解密结果之后,与之前的字符审进行比较,如果相同,则可以登最成功。
原理图:
Shell 是命令解释器(command interpreter),是Unix操作系统的用户接口。程序从用户接口得到输入信息, shell将用户程序及其输入翻译成操作系统内核( kernel )能够识别的指令,并且操作系统内核执行
完将返回的输出通过 shell 再呈现给用户,下图所示用户、shell和操作系统的关系:
Shell也是一一门编程语言,即 shell 脚本, shell 是解释执行的脚本语言。可直接调用linux命令。一个系统可以存在多个shell ,可以通过cat /et/shells 命令查看系统中安装的shell ,不同的shell可能支
持的命令语法是不相同的。
操作系统内核( kernel )与 shell 是独立的套件,而且都可被替换:
不同的操作系统使用不同的shell ;
同一个kernel之上可以使用不同的shell;
常见的shell分为两大主流:
Bourne shell(sh),Solaris.hpux 默认shell
Bourne again shell (bash),Linux 系统默认shell
C shell(csh)
tc shell(tcsh)
查看默认使用的 shell
命令:echo $SHELL
所谓临时变量是指在用户在当前登陆环境生效的变量,用户登陆系统后,直接在命令行上定义的环境变量便只能在当前的登陆环境中用。当退出系统后,环境变量将不能下次登陆时继续使用。
通过将环境变量定义写入到配置文件中,用户每次登陆时系统自动定义,则无需再到命令行重新定义。
定义环境交量的常见配置文件如下:
/etc/profile 针对系统所有用户生效,此文件应用于所有用户每次登陆系统时的环境变量定义, $HOME/.bash_profile 针对特定用户生效, HOME为用户的宿主目录,当用户登陆系统后,首先继承 /etc/profile 文件中的定义,再应用 $HOME/.bash_profile 文件中的定义。
系统环境变量对所有用户有效。如: P A T H 、 PATH、 PATH、HOME、 S H E L L 、 SHELL、 SHELL、PWD等等,如下用 echo 命令打印上述的系统环境变量:
同传统的编程语言一样。shell 提供了很多特性,这些特性可以使你的shel脚本编程更为有用。
1)创建Shell脚本
一个shell脚本通常包含如下部分:
首行
第一行内容在脚本的首行左侧,表示脚本将要调用的shell 解释器,内容如下:
#!/bin/bash
#! 符号能够被内核识别成是一个脚本的开始,这一行必须位于脚本的首行, /bin/bash是bash程序的绝对路径。在这里表示后续的内容将通过bash程序解释执行。
注释
注释符号 # 放在需注释内容的前面
注意:当脚本没有执行权限时,root和文件所有者通过 bash/sh 或者source也可以能正常执行。
第一种:bash或sh+*脚本
sh helloworld.sh
第二种:在脚本的路径前加上“.”或source
source /root/helloworld.sh
…/helloworld.sh
区别:第一种会新开一个bash,不同bash 中的变量无法共享
第二种使用 . ./ 脚本.sh 这种方式在同一个shell里面执行
变量:是shell传递数据的一种方式,用来代表每个取值的符号名。
当 shell 脚本需要保存一些信息时,如一个文件名或是个数字,就把它存放在一个变量中。
1.变量名称可以由字母,数字和下划线组成。但是不能以数字开头,环境变量名建议大写,便于区分。
2.在bash中。变量的默认类型都是字符串型。如果要进行数值运算,则必须指定变量类型为数值型。
3.变量用等号连接值,等号左右两侧不能有空格。
4.变量的值如果有空格,需要使用单引号或者双引号包括,
Linux Shell中的变量分为用户自定义变量环境变量、位置参数变量和预定义变量。
可以通过set命令查看系统中存在的所有变量
系统变量:保存和系统操作环境相关的数据。$HOME, P W D 、 PWD、 PWD、SHELL, $USER等等
位置参数变量:主要用来向脚本中传递参数或数据。变量名不能自定义,变量作用固定。
预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
用户自定义的变量由字母或下划线开头,由字母。数字或下划线序列组成,并且大小写字母意义不同,变量名长度没有限制。
1)设置变量
习惯上用大写字母来命名变量。变量名以字母表示的字符开头,不能用数字。
2)变量调用
在使用变量时, 要在变量名前加上前缀 “$”
使用echo命令查看变量值
eg: echo $A
3)变量赋值
第一种:定义时赋值:
变量=值.
等号两侧不能有空格
eg: STR=“hello world”
第二种:将一个命令的执行结果赋给交量
eg: A=’Is-la‘ 反引号,运行里面的命令,并把结果返回给变量A
eg: A=$(s -la)等价于反引号
eg: aa=$((4+5))
eg:bb=’ expr 4+5 ’
第三种:将个变量赋给另一个变量
eg: A=$STR
4)变量叠加
eg:aa=123
eg:cc="$aa"456
eg: dd=${aa}789
现象:单引号里的内容会全部输出,而双引号里的内容会有变化
原因:单引号会将所有特殊字符脱意
eg: NUM=10
SUM="$NUM hehe" echo $SUM 输出10 hehe
SUM2=’$NUM hehe’ echo S U M 2 输 出 SUM2 输出 SUM2输出NUM hehe
5)列出所有的变量
set
6)删除变量
eg:unset NAME
eg:unset A 撤销变量A
eg:readonly B=2,不能unset
用户自定义变量,作用域为当前shell
用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和其所有子shell中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的shell中生效。
export 变量名=变量值 申明变量
作用域:当前shell以及所有的子shell
$n |n为数字, $0代表命令本身, $1-$9代表第1到第9个参数. 十以上的参数需要用大括号包含,如${10}.
$* | 代表命令行中所有的参数,把所有的参数看成一个整体。以"$1,$2...$n"的形式输出所有参数
$@ | 代表命令行中的所有参数,把每个参数区分对待。以"$1"$2""..."$n"的形式输出所有参数
$#
shift 指令:参数左移,每执行一次。参数序列顺次左移一个位置, $# 的值减1,用于分别处理每个参数,移出去的参数不再可用
$*和S@的区别
∗ 和 * 和 ∗和@ 都表示传递给函数或脚本的所有参数。不被双引号"“包含时,都以”$1""$2" …"Sn"的形式输出所有参数
当它们被双引号" “包含时,”$*" 会将所有的参数作为一个整体,以"$1 $2 … n " 的 形 式 输 出 所 有 参 数 ; “ n"的形式输出所有参数;“ n"的形式输出所有参数;“@“会将各个参数分开,以”$1"" 2 " . . . " 2" ... " 2"..."n"的形式输出所有参数
shell 脚本标中执行测试
35.6 预定义变量
$? | 执行上一个命令的返回值 执行成功,返回0,执行失败返回非0 |
---|---|
$$ | 当前进程的进程号PID,即当前脚本执行时生成的进程号 |
$! | 后台运行的最后一个进程的进程号,最近一个被放入后台执行的进程 $ |
测试 $$:
编写shell 脚本 vi pre.sh
pwd > /dev/null
read [选项] 值
read -p (提示语句) -n (字符个数) -t (等待时间, 单位为秒) -s (隐藏输入)
read -t 30 -p “please input your name:” NAME
echo $NAME
read -s -p “please input yourage:” AGE
echo $AGE 注意:如果隐藏输入,这里的结果是看不到的
read -n 1 -p “please input your sex [M/F]:” GENDER
echo $GENDER
注意:
1.在输入时,如果输错了要删除要执行control+delete
2.不要输入中文
3.NAME与"之间要有空格
num1=11
num2=22
sum= n u m 1 + num1+ num1+num2
echo $num
格式:expr m + n 或 $((m+n)) 注意expr与运算符和变量问要有空格
Sum=$((m+n))中 = 与 $ 之间没有空格
expr命令:对整数型变量进行算术运算
(注意:运算符前后必须要有空格)
`expr 3 + 5`
`expr 3 - 5 `
echo `expr 10/3`
10/3的结果为3 ,因为是取整
`expr 3\*10`
\ 是转义符
计算(2 +3 )x4的值
分布计算
s= `expr 2 + 3`
expr $s \* 4
echo $s
一步计算
expr `expr 2 + 3 ` \* 4
s= `expr \ `expr 2 + 3 \ ` \*4`
( ) 与 ( )与 ()与{ }的区别
$( )的用途和反引号`` 一样,用来表示优先执行的命令
eg: echo $(ls /root)
${ } 取变量
eg: echo ${PATH}
$ ((运算内容))适用于数值运算
eg: echo $((3+1*4))
内置test命令常用操作符号[ ]表示,将表达式写在[ ]中,如下:
[ expression ]
或者:
test expression
注意: expression首尾都有个空格
eg: [ ]:echo $?
测试范围:整数、字符串、文件
表达式结果为真,则test发返回值为0,否则为非0
当表达式结果为真时,则变量$?的值就为0,否则非0
test $str1 == $str2 测试字符早是否相等 有空格
test $str1 != $str2 测试字符串是否不相等
test $str1 测试字符串是否不为空,不为空:返回true ,为空:返回false
" "代表空字符事–是空
test -n $str1 测试字符事是否不为空
test -z $str1 测试字符串是否为空
name=linzhiling
&&逻辑与条件满足,才执行后面的语句
[-z “$name” ] && echo invalid || echo ok
|| 逻辑或, 条件不满足,才执行后面的语句
test “$name” == "yangmi && echo ok || echo invalid
test int1 -eq int2 测试整数是否相等 equals
test int1 -ge int2 测试int1是否 >=int2
test int1 -gt int2 测试int1是否>int2
test int1 -le int2 测试int1是否<=int2
test int1 -lt int2 测试int1是否 test int1 -ne int2 测试整数是否不相等 eg: test 100 -gt 100 && echo ‘ok’ || echo ‘no’ test -d file 指定文件是否目录 test -e file 文件是否存在 exists test -f file 指定文件是否是常规文件 test-L File 文件存在并且是一个符号链接 test -r file 指定文件是否可读 test -w file 指定文件是否可写 test -x file 指定文件是否可执行 eg: test -d install.log test -r instal.log test -f xx.log : echo $? [ -L service.soft ] && echo "Is a link test -L /bin/sh : echo $? [ -f/root ] && echo “yes” II echo “no” 条件1 -a 条件2 逻辑与 两个都成立,则为真 条件1 -o 条件2 逻辑或 只要有一 个为真, 则为真 !条件 逻辑非 取反 eg: num=250 [ -n “ n u m " − a " num" -a " num"−a"num” -ge 520 ] && echo “marry you” || echo “go on” age=20 pathname=outlog [ ! -d “$ pathname” ] && echo usable || echo used if / else 命令 单分支if条件语句 if [ 条件判断式 ] ##空格 then 程序 fi 或者 if [ 条件判断式 ] ; then 程序 fi eg: !/bin/sh if [ -x /etc/rc.d/init.d/httpd ] then /etc/rc.d/init.d/httpd restart fi 单分支条件语句需要注意的几项 if 语句使用fi 结尾和一班语句使用大括号不同 [ 条件判断式 ],就是使用test命令判断,所以中括号和条件判断式之间必须有空格 then后面跟符号条件之后执行的程序,可以放在[ ]之后,用;分割,也可以换行写入 if与[ ]之间必须有空格 if [ 条件判断式1 ] then 当条件判断式1成立时,执行程序2 elif …省略更多条件 else 当所有条件不成立时执行此程序 fi case命令是一个多分支的if/else命令 , case变量的值用来匹配value1,value2,value3等等,匹配到后则执行跟在后面的命令直到遇到双分号为止( ;; )case命令以esac作为终止符 case行尾必须为单词 in 每个模式必须以右括号 ) 结束 匹配模式中可使用方括号表示一个连续的范围,如[0-9] ;使用竖杠符号 “|” 表示或 最后的 “* ) “表示默认模式,当使用前面的各种模式均无法匹配该变量时,将执行”* )” 后的命令序列 格式 CMD=$1 case $CMD in start) echo “starting” ;; stop) echo “stoping” ;; test) echo “I’m testing” ;; *) echo “Usage: {start | stop}” esac for循环命令用来在一个列表条目中执行有限次数的命令。 比如,你可能会在一个姓名列表或文件列表中循环执行同个命令。 for命令后紧跟一个自定义变量、 一 个关键字 in 和一个字符串列表(可以是变量)。第一次执行for循环时,字符串列表中的第一个字符串会赋值给自定义变量。然后执行循环命令,直到遇到done语句;第二次执行for循环时,会右推字符串列表中的第二个字符串始自定义变量。依次类推,直到字符串列表遍历完。 第一种: do echo $N done 或 for N in 1 2 3; do echo $N; done 或 for N in {1…3}; do echo $N; done 第二种: for ((i=0;i<= 5;i++)) do echo “welcom $i times” done 或 for ((i=0;1<= 5: ++));do echo “welcom $i times”;done 注意:until 循环与while正好相反,即:while是条件成立循环执行:until是条件不成立执行 while命令根据紧跟其后的命令(command)来判断是否执行while循环,当command执行的返回值(exlit status)为0时,则执行while循环语句块,直到遇到done语句,然后再返回到while命令,判断command的返回值,当返回值为非0时,则终止while循环 第一种 while [ expression ] do command … done 函数代表着一个或一组命令的集合,表示一个功能模块。 常用于模块化编程。 以下是关于函数的一些重要说明: 在shell中,函数必须先定义,再调用 使用return value来获取函数的返回值 函数在当前shell中执行,可以使用脚本中的变量 函数的格式如下: 函数名 () { 命令2… return返回值变量 } 结构: [ function ] funname [ () ] action; [ return int; ] } function start() /function start / start( ) 注意: 如果函数名后没有(),在函数名和{}之间必须有空格加以区分 函数返回值,只能通过$! 系统变量获得,可以显示加:return返回值 如果不加return,将以最后一条命令的执行结果作为返回值 return后的内容以字符串的形式写入,但执行时会自动转换成数值型,范围:数值n(0-255) 1) 编写脚本:test.sh 2)执行bash -x test.sh 说明:这将执行该脚本并显示所有变量值 3)在脚本里添加set -x,对部分脚本进行调试 执行bash test.sh 1 4) bash -n script 不执行脚本只是检查语法的模式,将返回所有语法错误,如函数没有正确闭合 5)bash -v test.sh 执行并显示脚本内容 cut [选项] 文件名 默认分割符是制表符,一个制表符代表一列 选项: -f 列号: 提取第几列 -d 分隔符:按照指定分隔符分割列 eg: cut -f 2 aa.txt 提取第二列 eg: cut -d “:” -f 1,3 /etc/passwd 以 : 分割,提取第1和第3列 eg: cat /etc/passwd | grep /bin/bash | grep -v root | cut -d “:” -f 1获取所有可登陆的普通用户用户名 cut的局限性 不能分割不定长度的空格 比如 df -h 不能使用cut分割 df -h | grepsda1 | cut -f 5 一个强大的文本分析工具 把文件逐行的读入,以空格为默认分限符将每行切片,切开的部分再进行各种分析处理。 语法: awk条件1{动作1}条件2{动作2}…文件名 条件(Pattern) : 一般使用关系表达式作为条件: > >= <=等 动作(Action) : 格式化输出 流程控制语句 eg: df -h | awk ‘{print $1 “\t” $3}’ 显示第一列和第三列 eg: cat /etc/passwd | grep “/bin/bash” | awk ‘BEGIN {FS=":"} {print$1 “\t” $3}’ 输出可登陆用户的用户名和UID,这里使用FS内置变量指定分隔符为: ,而且使用BEGIN保证第一行也操作, 因为awk命令会在读取第一行后再执行条件 注意:指定分隔符用 -F 更简单 eg: cat /etc/passwd | grep “/bin/bash” | awk -F: '{print $1 " \t" $3}'效果同上 eg: 判断一下根目录的使用情况 df -h | grep sda1 | awk ‘{print $5}’ | awk -F% ‘{print $1} $1<80{print “info”}$1>80{print “warning”}’ BEGIN在所有数据读取之前执行 eg: awk ‘BEGIN {printf “first Line \n”} {printf $2}’ aa.txt在输出之前使用BEGIN输出内容 END在所有数据执行之后执行 eg: awk ‘END {printf “The End \n”} {print $2}’ aa.txt所有命令执行完后,输出一句"The End" df -h | grep sda2 | awk ‘{print $5}’ | awk -F % ‘{print $1}’ df -h | grep sda2 | awk ‘{print $5}’ | cut -d “%” -f 1 eg:获取所有用户信息里的用户名: cat /etc/passwd | awk -F: ‘{print $1}’ awk -F: ‘{print $1}’ /etc/passwd 获取本机ip地址 ifconfig eth0 | grep “inet addr:” | awk -F : ‘{print $2}’|awk ‘{print $1}’ sed: stream edltor sed是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。标准输入可能是来自键盘、文件重定向、字符串或变量,或者是一个管道的文本。 注意: sed 并不与初始化文件打交道,它操作的只是一 个拷贝, 然后所有的改动如果没有重定向到一个文件,将输出到屏幕。 语法: sed [选项] [动作] 文件名 常用选项: -n 使用安静(silent) 模式,显示经过sed特殊处理的数据。 -e 允许多点编辑。 -i 直接修改读取的档案内容,而不是由屏出输出。 eg: sed ‘2p’ sed.txt 显示第二行和所有数据 eg: sed -n "2,3p’ sed.txt只显示第二和第三行 eg: df -h | sed -n ‘1p’ 按收命令结果数据 eg: sed ‘2a bing’ sed.txt 在第二行后面添加数据 eg: sed ‘4i fengile \ chenchen’ sed.txt 在第4行之前添加两行数据 eg: sed ‘2c this is replace’ sed.txt 替换第二行数据 eg: sed ‘s/it/edu360/g’ sed.txt 把sed.txt文件中的i普换为edu360, 并输出 eg: sed -e ‘1s/1/34/g:3s/yangmi//g’ sed.txt 同时进行多个替换 eg: sed -i ‘s/it/edu360/g’ sed.txt 要想真正替换, 需要使用i参数 eg:使用sed获取本机的ip地址 注意:在对文本进行匹配的时候,^是一个文件的开始 $ 是一个文件的结束 ^.*addr :意思是说从开始到addr的全部内容 ifconfig eth0 | grep ‘inet addr’ | sed ‘s/^.addr://g’ | sed 's/ Bcast.$//g’ crontab 命令允许用户提交,编辑或删除相应的作业。每一个用户都可以有一个crontab文件来保存调度信息。可以使用它运行任意一个shell脚本或某个命令 crontab -e 使用编辑器编辑当前的crontab文件 crontab -l 查看所有的任务 service crond start 启动服务 service crond stop service crond restart service crond status minute hour day-of-month month-of-year day-of-week commands 分<>时<>日<>月<>星期<>要运行的命令 <>表示空格 其中 minute 一小时中的哪一分钟 【0-59】 hour 一天中的哪一小时 【0-23】 day-of-month 一月中的哪一天 【1-31】 month-of-year 一年中的哪一月 【1-12】 day-of-week 一周中的哪一天 【0-6】 commands 执行的命令 书写注意事项 eg: 4点备份 0 4 * * * eg: 每周二,周五,下午6点的计划任务 0 18 * * 2,5 eg: 1到3月份,每周二 周五,下午6点的计划任务 0 18 * 1-3 2,5 eg:周一到周五下午,5点半提醒学生15分钟后关机 30 17 * * 1-5 /usr/bIn/wail < /etc/lssue 45 17 * * 1-5 /sbin/shutdow -h now eg:学校的计划任务,12点14点, 检查apache服务 是否启动 */2 12-14 * 3-6,9-12 1-5 eg: 再添加一一个备份,把/etc目录备份到/backup下,然后把错误的情况也记录下来,正确的文件都丢到/dev/null下,看不见(相当于一个黑洞) */2 12-14 * 3-6,9-12 1-5 /bin/cp -r /etc /backup/etc.20170407 2> /backup/etc.bak.err/dew/null eg : 每月1、10、2 2日的4:45运行/apps/bln月录下的backup.sh 45 4 1,10,22 * * /apps/bin/backup.sh eg: 每周六、周日的1: 10运行一个find命令 10 1 * * 6,0 /bin/find -name “core” -exec rm{}: eg:在每天18:00至23 :00之间每隔30分钟运行/apps/bin月录下的dbcheck.sh 0,30 18-23 * * * /apps/bin/dbcheck.sh eg:每星期六的11:00 pm运行/apps/bin日录下的qtrend.sh 0 23 * * 6 /apps/bin/qtrend.sh38.4 文件测试
38.5 多重条件测试
39 条件控制语句
39.1 if 条件语句-单分支
39.2 if 条件语句-多分支
39.3 case
40 循环
40.1 for循环
for N in 1 2 3
或
for N in {1,2,3}; do echo $N; done 注意: {}中的数字之间不能有空格#!/bin/bash
#求1到cmd的和
CMD=$1
sum=0
for ((i=1;i<=$CMD;i++))
do
sum=$(($sum+$i))
done
echo $sum
40.2 while 循环
#!/bin/bash
#求1-cmd各个数的平方和
cmd=$1
num=1
sum=0
while [ $num -le 10 ]
do
sum=`expr $num \* $num`
echo $sum
num=`expr $num + 1`
done
41 方法
命令1…#!/bin/bash
function start() {
echo "starting"
}
stop() {
echo "stopping"
}
function restart {
echo "restart"
}
$1
42 脚本测试
#!/bin/bash
a=$1
set -x
b=3
echo "b:"+$b
c=$a
echo $a
显示:
[root@localhost test]# bash -x test.sh 1
+ a=1
+ b=3
+ echo b:+3
b:+3
+ c=1
+ echo 1
1
显示:
[root@localhost test]# bash test.sh 1
+ b=3
+ echo b:+3
b:+3
+ c=1
+ echo 1
1
1 #!/bin/bash
2 a=$1
3 set -x
4 b=3
5 echo "b:"+$b
6 c=$a
7 echo $a
8
9 for n in 1 2 3
10 do
11 echop $n
12 #这里少done
13
14 function start {
15 echo "hahaha"
16 }
17 start
18
[root@localhost test]# bash -n test.sh
test.sh: line 18: syntax error: unexpected end of file
43 awk 介绍
43.1 cut 命令
43.2 awk 介绍
43.3 FS 内置变量
44 sed 介绍
44.1 sed
命令
功能描述
a
新增,a的后面可以接字符串,在下一行出现 注意:最好动作使用单引导,可以自动换行
c
替换
d
删除
i
插入,i的后面可以接字符串
p
打印
s
查找并替换,例如1.20s/old/new/g
44.2 sed命令的使用
45 定时器
45.1 定时器介绍
45.2 crontab 命令格式
45.3 crontab 文件格式
45.4 使用crontab运行多个任务
45.5 实例