命令
service network restart 重启网络
systemctl network restart
systemctl restart ssh
name=“value” 变量赋值
$(1.../@/*/#/0/?/$) 位置变量
test EXPRESSION 测试命令
export 设置全局变量
readonly name 设置只读变量
env、printenv、export、declare -x 查看全局变量
shift 左移参数
let 算数运算
read 接收输入
locate 查询系统上预建的文件索引数据库
find 通过遍历指定路径完成文件查找
xargs 分割过大参数
压缩/解压缩:
compress/uncompress
gzip/gunzip
bzip2/bunzip2
xz/unxz
zip/unzip
tar 打包文件
cpio 通过重定向打包压缩备份
sed 行编辑器
shell脚本编程基础
编程基础
程序:指令+数据
程序编程风格:
过程式:以指令为中心,数据服务于指令
对象式:以数据为中心,指令服务于数据
shell程序:提供了编程能力,解释执行
程序的执行方式
计算机运行二进制指令
编程语言:
低级:汇编
高级:
编译:高级语言-->编译器(程序员)-->目标代码(java,C#)
解释:高级语言-->解释器(电脑)-->机器代码(shell,perl,python)
编程基本概念
编程逻辑处理方式:
顺序执行,循环执行,选择执行
shell编程:
过程式,解释执行
编程语言的基本结构:
各种系统命令的组合
数据存储:变量、数组
表达式:a+b
语句:if
shell脚本:
包含一些命令或声明,并符合一定格式的文本文件
格式要求:
首行shebang机制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
声明所使用的语言
shell脚本用途:
自动化常用命令
执行系统管理命令
创建简单的应用程序
处理文本或文件
创建shell脚本:
第一步:使用文本编辑器来创建文本文件
第一行必须包括shell声明序列:#!
添加注释,以#开头
第二步:运行脚本
给予执行权限,在命令行上指定脚本的绝对或相对路径
直接运行解释器,将脚本作为解释器程序的参数运行
脚本规范:
脚本代码开头约定
1、第一行一般为调用使用的语言
2、程序名,避免更改文件名为无法找到正确的文件
3、版本号
4、更改后的时间
5、作者相关信息
6、该程序的作用,及注意事项
7、最后是各个版本的更新简要说明
脚本调试
检测脚本中的语法错误(只能检测出语法错误)
bash -n
调试执行
bash -x
变量
变量:命名的内存空间
数据储存方式:
字符
数值(整型,浮点型)
变量类型作用:
1、数据存储格式
2、参与的运算
3、表示的数据范围
附:
强类型变量:
变量不经过强制转换,他永远是这个数据类型,不允许隐式的类型转换。一般定
义变量是必须指定类型,参与运算必须符合类型要求;调用为声明变量会产生错
误。如:java,c#
弱类型变量:
语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运
算时会自动进行隐式类型转换;变量无须事先定义可直接调用
。如:bash(不支持浮点数),php
变量命名法则:
1、不能使用程序中的保留字(if,for等)
2、只能使用数字、字母以及下划线,且不能以数字开头
3、见名知义
4、统一命名规则:驼峰命名法(AbcDfg大驼峰;abcDfg小驼峰)
bash中变量种类
根据变量的生效范围等标准划分为下面变量类型:
局部变量:
生效范围为当前shell进程,对其他任何shell进程均无效
变量赋值:name=‘value’
可以使用引用value:
(1)可以是直接字串:name=“root”
(2)变量引用:name=“$USER”
“”:强引用,其中的变量引用会被替换为变量值
‘’:弱引用,其中的变量引用不会被替换为变量值,而保持原字符串
(3)命令引用:name=command
name=$(command)
显示已定义的所有变量:set
附:""可以保留变量内容格式
删除变量:unset name
环境(全局)变量:
生效范围为当前shell进程及其子进程,全局变量可往下传(父->子),但不能
回传
变量声明、赋值:
export name=VALUEexport
可将将局部变量转换成环境变量
declare -x name=VALUE
变量引用:$name,${name}
显示所有环境变量:
env
printenv
export
declare -x
删除变量:
unset name
bash内建的环境变量:
PATH、SHELL、USER、UID、HOME、PWD、SHLVL(查看当前shell层级)、LANG(
语言)、MAIL、HOSTNAME、HISTSIZE、_
(上个命令的最后一个字符串)
附:
()与{}的区别
共同点:执行多个命令的组合
不同点:()开个一次性子shell,对当前shell环境无影响,用于一次性任务(括号内
shellpid=当前shellpid,变量继承当前变量)
{}不开启子shell,对当前环境有影响,位置变量超过10需用{10}表示
{}中前后都需要加空格,且命令都需要跟;
本地变量:
生效范围为当前shell进程中某代码片断,通常指函数
位置变量:
$1,$2,...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
只读变量:
只能声明,不能修改和删除
声明只读变量:
readonly name、declare -r name
查看只读变量:
readonly -p
退出状态
进程使用退出状态来报告成功或失败
0代表成功,1-255代表失败
$?变量保存最近的命令退出状态
退出状态码
bash自定义退出状态码
exit[n]:自定义退出状态码
注意:
1、脚本一旦遇到exit命令,脚本会立即终止,终止状态码取决于exit命令后面
的数字
2、如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的
最后一条命令的状态码
3、命令错误不影响继续执行,语法错误终止执行
shift
作用:将输入参数整体向左移(默认一位),后一位取代前一位
shift多用于循环
算数运算
bash中的算数运算:help let
+,-,*
,/,%(取模,取余),**
(乘方)
实现算数运算:
1、let var=算数表达式
2、var=$[算数表达式]
3、var=$((算数表达式))
4、var=$(expr arg1 arg2 arg3 ...)(arg参数)
5、declare -i var=数值
6、echo ‘算数表达式‘ |bc
乘法符号有些场景中需要转义,如*
bash有内建的随机数生成器:$RANDOM(0-32767)
echo$[$RANDOM%50]:0-49间的随机数
增强型赋值:
x+=(x=x+1)、-=、*
=、/=、%=
let x+=3:x自加3后自赋值
自增,自减:
let var+=1
let var++
let var-=1
let var--
逻辑运算
0 false
1 true
与;或
0&0=0;0|0=0
0&1=0;0|1=1
1&0=0;1|0=1
1&1=0;1|1=1
短路与,短路或
0&&0=0
0&&1=0
1&&0=0
1&&1=1
cmd1 && cmd2
若cmd1为假,cmd2不执行;反之,cmd2执行
0||0=0
0||1=1
1||0=1
1||1=1
cmd1 || cmd2
若cmd1为真,cmd2不执行;反之,cmd2执行
xor 异或
0^0=0
0^1=1
1^0=1
1^1=0
同为假,异为真
作用:取反
条件性的执行操作符
根据退出状态而定,命令可以有条件地运行
&&:代表条件性的AND THEN
||:代表条件性的OR ELSE
条件测试
判断某需求是否满足,需要由测试机制来实现:
专用的测试表达式需要由测试命令辅助完成测试过程
评估布尔声明,以便用在条件性执行中:
真,返回0
假,返回1
测试命令:
test EXPRESSION
[ EXPRESSION ](用于普通匹配)
[[ EXPRESSION ]](用于利用扩展正则匹配)
注意:EXPRESSION前后必须有空白字符
test命令
长格式的例子:
test"$A"=="$B"&&echo"Strings are equal"
test "$A" -eq "$B" &&echo"Integers are equal"
简写格式的例子:
["$A"=="$B"]&&echo"Strings are equal"
["$A" -eq "$B"]&&echo"Integers are equal"
bash的数值测试
-v(VAR)变量VAR是否设置
数值测试:
-gt是否大于
-ge是否大于等于
-eq是否等于
-ne是否不等于
-lt是否小于
-le是否小于等于
bash的字符串测试
字符串测试:
==是否等于>
ascii码是否大于ascii码
<是否小于
!=是否不等于
=~左侧字符串是否能够被右侧的PATTERN()所匹配
注意:此表达式一般用于[[]]中,扩展的正则表达式
-z“STRING”:字符串是否为空,空为真,不空为假
-n“STRING”:字符串是否不空,不空为真,空为假
注意:用于字符串比较时的用到的操作数都应该使用引号
bash文件测试
存在性测试:
-a FILE:同-e
-e FILE:文件存在性测试,存在为真,否则为假
存在性及类别测试:
-b FILE:是否存在且为设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h或-L FILE:存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件
文件权限测试:
-r FILE:是否存在且可读
-w FILE:是否存在且可写
-x FILE:是否存在且可执行
文件特殊权限测试:
-u FILE:是否存在且拥有suid权限
-g FILE:是否存在且拥有sgid权限
-k FILE:是否存在且拥有sticky权限
文件大小测试:
-s FILE:是否存在且非空
文件是否打开:
-t fd:fd文件描述符是否在某终端已经打开
-N FILE:文件自从上次被读取之后是否被修改过
-O FILE:当前有效用户是否为文件属主
-G FILE:当前有效用户是否为文件属组
双目测试:
FILE1 -e FILE2:FILE1是否是FILE2的硬链接
FILE1 -nt FILE2:FILE1是否新于FILE2(mitme)
FILE1 -ot FILE2:FILE1是否旧于FILE2
bash的组合测试条件
方式一:
cmd1&&cmd2 并且
cmd1||cmd2 或者
!cmd 非
方式二:
EXPRESSION1(表达式) -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
!EXPRESSION 非
注意:必须使用测试命令进行
使用read命令来接收输入
用read命令把输入的值分配给一个或多个shell变量
-p 指定要显示的提示,输入不换行
-s 静默输入,一般用于密码
-n 指定输入的字符长度
-d 指定输入结束符
-t 指定TIMEOUT时间
read从标准输入中读取值,给每个单词分配一个变量,所有剩余单词都被分配给
最后一个变量
read批量赋值:
read x y z <file
read x y z <<<"a b c"
防止扩展
反斜线:
会使随后的字符按原意解释
加引号来防止扩展:
单引号防止所有扩展
双引号也防止所有扩展,但以下情况例外:
$-变量扩展
反引号-命令扩展
-禁止单个字符扩展
!-历史命令替换
bash的配置文件
安生效范围划分:
全局配置:
/etc/profile
/etc/profile.d/*
.sh
/etc/bashrc
(profile:配置文件,放环境变量和启动程序)
(bashrc:bash run command,即bash的运行配置文件,放别名和函数)
个人配置:
~/.bash_profile
~/.bashrc
shell登录的两种方式
交互式登录:
1、直接通过终端输入账号密码登录
2、使用“su - UserName”切换用户
执行顺序:/etc/profile-->/etc/profile.d/.sh-->~/.bash_profile-- >~/bashrc-->/etc/bashrc
非交互式登录:
1、su UserName
2、图形界面下打开终端
3、执行脚本
4、任何其他的bash实例
执行顺序:~/bashrc-->/etc/bashrc-->/etc/profile.d/``.sh
按功能划分:
profile类:
为加交互式登录的shell提供配置
全局:/etc/profile,/etc/profile.d/*
.sh
个人:~/bash_profile
功用:(1)用户定义环境变量 (2)运行命令或脚本
bashrc类:
全局:/etc/bashrc
个人:~/.bashrc
功用:(1)定义命令别名和函数 (2)定义本地变量
编辑配置文件生效
修改profile和bashrc文件后需生效
两种方法:
1、重新启动shell进程
2、.或source
Bash退出任务
保存在~/.bash_logout文件中(用户)
在退出登录shell时运行
用于:
1、创建自动备份
2、清除临时文件
$-变量(代表一些功能的组合)
h:hashall,打开这个选项后,shell会将命令所在路径hash下来,避免每次都
要查询。通过set +h,将h选项关闭
i:interactive-comments,包含这个选项说明当前的shell是一个交互式的
shell。所谓的交互式shell,在脚本中,i选项是关闭的
m:monitor,打开监控模式,就可以通过Job control来控制进程的停止、继续
,后台或者前台执行等
B:braceexpand,大括号扩展
H;history,H选项打开,可以展开历史列表中的命令,可以通过!来完成使用
,如:“!!”返回最近一个历史命令,“!n”返回第n个历史命令
附:
1、.(source)和直接运行脚本的区别
source运行脚本是在当前shell中运行,改变的是当前shell的变量
直接运行脚本是在shell子进程中运行,改变子进程变量,对当前shell无影响
2、脚本中不识别别名,别名无法生效
bash如何展开命令行(执行顺序)
1、把命令行分成单个命令词
2、展开别名
3、展开{}内容
4、展开~符
5、用命令替换$()和“”
6、再把命令行分成命令词
7、展开文件通配符
8、处理重定向
9、运行命令
文件查找
在文件系统上查找符合条件的文件
命令:
非实时查找(数据库查找):locate
实时查找:find
locate搜索速度快,但不能实时更新
find功能强大,但搜索很慢,影响服务器性能
locate
查询系统上预建的文件索引数据库
/var/lib/mlocate/molcate.db
依赖于事先构建好的索引
索引的构建是在系统较为空闲时自动进行(周期性任务),管理员手动更新数据
库(updatadb)
索引构建过程需要遍历整个根文件系统,极消耗资源
工作特点:
查找速度快
模糊查找
非实时查找
搜索的是文件的全路径,不仅仅是文件名
可能只搜索用户具备读取和执行权限的目录
locate命令
locate KEYWORD
有的选项:
-i 不区分大小写的搜索
-n N 只列举前N个匹配选项
-r 使用正则表达式
find
实时查找工具,通过遍历指定路径完成文件查找
工作特点:
查找速度慢
精确查找
实时查找
可能只搜索用户具备读取和执行权限的目录
find命令:
find [OPTION]...[查找路径][查找条件][处理动作]
查找路径:指定具体目标路径(默认为当前目录)
查找条件:指定的查找目标,可以文件名、大小、类型、权限等标准进行(默认
为找出指定路径下的所有文件)
处理动作:对符合条件的文件做操作(默认输出至屏幕)
查找条件
指搜索层级:
-maxdepth level 最大搜索目录深度,指定目录为第一级
-mindepth level 最小搜索目录深度
根据文件名和inode查找:
-name“文件名称”:支持使用glob(通配符:*
,?,[],[^])
-iname“文件名称”:不区分字母大小写
-inum n:按inode号查找(inode节点编号)
-samefile name:相同inode号的文件
-links n:链接数为n的文件
-regex“PATTERN”:以PATTERN匹配整个文件路径字符串,而不仅仅是文件名
根据属主、属组查找:
-user USERNAME:查找属主为指定用户的文件
-group GRPNSME:查找属组为指定组的文件
-uid UserID:查找属主为指定UID号的文件
-gid GroupID:查找属组为指定GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
根据文件类型查找:
-type TYPE:
f:普通文件
d:目录文件
l:符号链接文件
s:套接字文件
b:块设备文件
c:字符设备文件
p:管道文件
-empty:空文件或目录
-prune:排除(prune:砍掉,去除)
组合条件:
与:-a
或:-o
非:-not;!
德?摩根定律:
(非A)或(非B)=非(A且B)
(非A)且(非B)=非(A或B)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
根据文件大小来查找:
-size [+|-]#UNIT
常用单位:k,M,G,c(byte)
#UNIT:(#-1,#]
-#UNIT:[0,#-1]
+#UNIT:(#,无穷)
根据时间戳:
以“天”为单位:
-atime [+|-]#
#:[#,#+1)
+#:[#+1,无穷]
-#:[0,#)
-mtime
-ctime
以“分钟”为单位:
-amin
-mmin
-cmin
根据权限查找:
-perm [/|-]MODE
MODE:精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,/表
示并集(老版本为+)
-MODE:每一类对象都必须同时拥有指定权限,与关系
0表示不关注
处理动作
-print:默认的处理动作,显示至屏幕
-ls:类似于对查找到的文件执行“ls -l”
-delete:删除查找到的文件
-fls file:查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND{}\;:对查找到的每个文件执行由COMMAND指定的命令,对于每个
文件执行命令前,都会交互式要求用户确认
-exec COMMAND{}\;:对查找到的每个文件执行由COMMAND指定的命令
{}:用于引用查找到的文件名称自身
ok和exec选项后必须跟\;
find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性
传递给后面的命令
参数替换xargs
xargs用于产生某个命令的参数,xargs可以读入stdin的数据,并且以空格符或
回车符将stdin的数据分隔成为arguments
xargs -n 解决参数过长无法执行问题
find和xargs组合使用格式:
find|xargs COMMAND
压缩、解压缩及归档工具
compress/uncompress:Z
-d:解压缩,相当于uncompress
-c:结果输出至标准输出,不删除原文件
-v:显示详情
gzip/gunzip:gz
-d:解压缩,相当于gunzip
-c
-#:1-9,指定压缩比,值越大压缩比越大(默认为6)
zcat:不解压前提下查看文本内容
bzip2/bunzip2
-k:保留原文件
-d
-#(默认为9)
bzcat
xz/unxz
-k
-d
-#(默认为6)
xzcat
zip/unzip
打包压缩
zip -r /testdir/sysconfig /etc/sysconfig/
附:
1、linux中文件名后缀要求不严格,但压缩工具对文件后缀名要求严格
2、xz太新,并不常用,常用的还是gzip和bzip
tar工具
tar(Tape ARchive,磁带归档的缩写)
(1)创建归档
tar -cpvf /PATH/TO/SOMEFILE.tar FILE...
(2)追加文件至归档(不支持对压缩文件追加)
tar -r -f /PATH/TO/SOMEFILE.tar FILE...
(3)查看归档文件中的文件列表
tar -t -f /PATH/TO/SOMEFILE.tar
(4)展开归档
tar -x -f /PATH/TO/SOMEFILE.tar
tar -x -f /PATH/TO/SOMEFILE.tar -C /PATH
(5)结合压缩工具实现:归档并压缩
-j:bzip2,-z:gzip,-J:xz
tar打包文件
-T:指定输入文件
-X:指定包含要排除的文件列表
分割(tar文件为多个小份文件):
split -b Size -d tar-file-name prefix-name
合并:
cat
cpio
功能:复制文件从或到归档
cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具它可以解压
缩以“.cpio”或者“.tar”结尾的文件
cpio[选项]>文件名或者设备名
cpio[选项]<文件名或者设备名
-o:将文件拷贝打包成文件或者将文件输出到设备上
-i:解包,将打包文件解压或将设备上的备份还原到系统
-t:预览,查看文件内容或者输出到设备上的文件内容
-v:显示打包过程中的文件名称
-d:解包生成目录,在cpio还原时,自动的建立目录
-c:一种较新的存储方式
文本处理三剑客
sed,行编辑器,一次处理一行内容,自带循环
处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环
功能:
主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
用法:
sed [option]...‘script’inputfile...
原文地址:http://blog.51cto.com/13672914/2102708