高性能linux服务器运维实战 shell应用案例
正则表达式与变量
正则表达式
正则表达式由普通字符和元字符组成
匹配规则网上可搜索,写几个自己用到的
.* 匹配任意多字符
\{n\} 匹配字符出现n次
\{n, \} 匹配字符至少出现n次
\{n, m\} 匹配字符出现n到m次之间
^$ 分别匹配字符开头和结尾
[] 字符集合, 即匹配括号内列出所有字符的任意一个字符的单字符
[^a-z] 匹配非a-z字符的任意一个字符
\<\> 匹配完整单词 思考案例iivery
变量
一般变量
赋值 a=123 或 a=`echo 123`
变量使用 $a 或 ${a}
删除变量 unset a
只读变量
参数变量
$@ $* 都表示传递给脚本或函数的所有参数。当被引号包含时,比如"$@" "$*",$@会将各个参数分开,以$1, $2...形式输出所有参数,$*会将所有参数作为一个整体输出参数
$0 表示命令行上shell程序名
$# 表示命令行上参数数量
$? 上一条命令执行完成的返回值
$$ 当前进程的进程号
$! 运行在后台最后一个作业的pid
$_ 在此之前执行命令或脚本的最后一个参数
IFS 是空白符变量
推荐使用$@而不是$*,因为$@的分隔符是空格,而$*的分隔符是IFS,如果改了IFS,$*的结果也会被动改变
使用第x个参数,可以${5}
可用$?获取上一个命令执行结果 0表示成功 1表示失败 126表示命令或脚本没有执行权限 127表示命令没找到
命令替换
read
变量测试 截取与替换
变量测试
${var:?word} 若var不存在则输出word并终止脚本
${var:+word} 若var存在则值为word,若var不存在返回空值 var不变
字符串长度与截取
${#var} 表示变量长度
${var:n} 输出字符串第n个字符以后的内容
${var:n:len} 输出变量第n个字符后长度为len的内容
${var#word} 删除var开头内容为word后输出剩下内容
${var%word} 删除var结尾内容为word的内容输出剩下内容
${var/old/new} 替换var中第一个出现的old为new
${var//old/new} 替换var中所有old为new
${var/#old/new} 替换var中开头的old为new,如果开头不为old则不替换
${var/%old/new} 替换var中结尾的old为new,类似/#
变量间接引用
注意用了eval和两个$间接引用
同时输出多行
两种方法 一个是双引号直接换行 一个是输入重定向 命令从echo改用cat
运算符 测试操作符 if语句
算数运算符
每种不同运算都会有不同的返回值
算数运算扩展
算是运算语句需如下格式 $[expression] $((expression))
也可以把赋值直接写道两个小括号
运算内部可以不加美元符号
还支持自加自减运算
小结 区分${} $() $[] $(())
${}是变量使用 $()是命令替换(`` 和 $()) 最后后两个是算术运算
算数运算指令expr
注意expr数字和运算符之间一定要有空格不然报错
算数运算指令let
let和expr不同,expr数字和运算符之间一定要有空格,let则一定不能由空格,如果非要有,将整个表达式用双引号括起来
自增减运算
即x++ ++x 自增运算只能是变量,不能是常数等
条件测试
条件测试
即通过$?看语句执行结果 0是ok非0是error
test与条件测试语句
测试语句格式如下
1 test<expression>
2 [ expression ]
3 [[ expression ]] (bash2.0以上版本)
1和2等价 3是2的扩展,比如逻辑运算符可以在3中使用但不能在2中使用,而且2无法正则表达,但3可以正则表达
需注意的是 2 和 3方括号两边都要有空格
例子
test expression
[ expression ]
方括号测试表达式
[[基本等价[,但实际扩展了[,比如正则和逻辑运算符等,可以将[[看作[和expr的相加
如果单括号用正则会返回1
字符串测试操作符
[ -z str ] 字符串长度为0返回真
[ -n str ] 字符串长度不为0返回真
[ str ] 字符串不为空 返回真
[ str1 = str2 ] 判断字符串相等,=也可以用==代替
[ str1 != str2 ] 判断字符串不相等,不能用!==代替!=
[[ str1 == str2 ]] 同上两个
[[ str1 =~ str2 ]] str2是str1的子字符串为真
对于条件判断的字符串,可以加上双引号防止字符串有空白字符比如空格等
较好的一个方法是形如[ "${x}" == "${y}"]
检查字符是否为空
判断字符串是否非空
逻辑测试操作符
逻辑测试操作符: -a 表示and -o 表示or !表示非
匹配模式的逻辑测试操作符: && || ! 注意 匹配模式的逻辑测试操作符只能用在[[而不能用在[中
整数测试操作符
-eq -ne -gt -ge -lt -le 这些可用于单双方括号
== != > >= < <=这些只能用于双小括号,注意双小括号两边的空格可以省略。这些也可以用在[ 和 [[中,但必须要加转义,否则可能报错
注意 双小括号用在方括号是否转义取决于bash实际版本 用的时候再搜搜 现在执行结果与资料不一致
文件测试操作符
-f 文件存在且为普通文件 返回真
-L 文件存在且为链接文件 真
-d 存在且为一个目录 真
-e 存在 真
-s 存在且大小大于0 真
-r 存在且可读 真
-w 存在且可写 真
-x 存在且可执行 真
条件测试举例
可以将&& 和||连用组成三目运算
if else语句
if 结构为 if ... elif ... elif ... else ... fi
注意如果要空语句则需要使用冒号: 类似于python的pass
case for 结构化命令
case语句
case类似高级语言的switch case,注意以下点
1 case 一旦匹配到,不会直接退出而是顺序执行匹配的后续每一个匹配模式
2 如果没匹配到,则执行*)后面的语句,可以不出现
3 每一个匹配模式最后必须要有一个双分号
for语句与结构化命令
列表for循环
循环的列表项以空格分割,可以省略in list,省略后的含义是$@
for x in * *表示当前目录下所偶文件名
使用命令执行结果作为循环的内容
数值类型的使用,类似py的range,有$(seq 10) {1..10..2}
break continue
和py类似,break 和continue后面可以跟一个数字,表示退出第几重循环
for语句 c语言型
while循环 util循环 select循环
while语句
while读文件
util语句
util语法格式和while一样,区别是until是为假继续执行,为真退出执行
select语句
可用于制作菜单 PS3是提示信息的环境变量
select也可以使用选择的数字进行判断,数字需要使用变量REPLY
函数
alias命令用来起别名
格式如下
function abc { echo 666 } 或
abc () {echo 666 }
调用函数 直接执行函数名即可
函数存储
两种情况 函数在一个脚本中,调用前要先定义;;函数不再一个脚本,调用前要先source 函数所在脚本名
函数显示
可用declare -F / -f / -f 函数名显示函数具体定义
unset -f可以从内存删除指定函数
export -f可将函数输出给shell
函数变量与返回值
如何调用函数入参: $1 $2 ${n} $@ $* 这样使用参数,定义函数时可以不写形参名称
$0始终代表脚本名称
函数内变量是全局作用域,如果使用local声明的变量,则是函数作用域
函数的返回
函数执行完默认返回 也可以用return n或exit n显式返回
注意函数返回值范围只能在0-256,超过范围会导致异常
函数和主程序不再一个脚本中的情况
shell案例汇总
查看进程状态
批量创建用户
随机密码可以这么弄