Shell脚本
基础的运维知识
脚本开发规范
- 脚本命名要有意义,文件后缀是.sh
- 脚本文件首行是而且必须是脚本解释器:
#!/bin/bash
- 脚本文件解释器后面要有脚本的基本信息等内容
- 脚本文件中尽量不用中文注释,尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰
- 脚本文件常见执行方式:bash 脚本名
常见的注释信息:脚本名称、脚本功能描述、脚本版本、脚本作者、联系方式等
注释
单行注释:#
,除了首行的#不是注释外,其他所有行内容,只要首个字符是#,那么就表示该行是注释
1 |
|
多行注释::<<! ... !
1 |
|
变量
变量包括两部分:变量名=变量值
shell中变量分为三大类
- 本地变量:手工方式定义的作用范围小的变量
- 全局变量:手工|默认方式定义作用范围大的变量
- 内置变量:bash命令中自带的一些参数变量类型
本地变量
普通变量
变量名=变量值
:变量值必须是一个整体,中间没有特殊字符变量名='变量值'
:我看到的内容,我就输出什么内容变量名="变量值"
:如果变量值范围内,有可以解析的变量A,那么首先解析变量A,将A的结果和其他内容组合成一个整体,重新赋值给变量B
建议:数字不加引号,其他默认加双引号
命令变量
执行`或者$()范围内的命令,将命令执行后的结果,赋值给新的变量名A
- 变量名=`命令`
- 变量名=$(命令)
全局变量
查看全局变量:env
定义全局变量:export 变量=值
查看变量:$变量名
,"变量名"
,${变量名}
,"${变量名}"
取消变量:unset 变量名
内置变量
脚本文件
$0
:获取当前执行的shell脚本文件名$n
:获取当前执行的shell脚本的第n个参数值,n为数字,当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来${10}
$#
:获取当前shell命令行中参数的总个数$?
:获取执行上一个指令的返回值,0为成功,非0为失败
精确截取
格式:${变量名:起始位置:截取长度}
1 |
|
默认值
${变量名:-默认值}
:如果变量有内容,就输出变量的内容,没有则输出默认值
${变量名+默认值}
:无论变量是否有内容,都输出默认值
表达式
使用格式:[ 表达式 ]
,左右两侧必须有空格,表达式条件成立则返回0
,不成立返回1
逻辑表达式
&&
:如果命令1执行成功则执行
命令2,否则命令2不执行
||
:如果命令1执行成功则命令2不执行
,否则命令2执行
1 |
|
文件表达式
-f
:判断输入的内容是否是一个文件
1 |
|
-d
:判断输入的内容是否是一个目录
1 |
|
-x
:判断输入内容是否可执行
1 |
|
数值操作符
-eq
:相等-gt
:大于-lt
:小于-ne
:不等于==
:字符串比较
1 |
|
计算表达式
使用:$(( 计算表达式 ))
或者let 计算表达式
,$(( 计算表达式 ))
中只能用+ - * /和()
运算符,并且只能用做整数运算
数组操作
在Shell中,用括号来表示数组,数组元素用空格符合分割
定义
1 |
|
查找
${array_name[index]}
1 |
|
修改
array_name[index]=值
1 |
|
删除
删除单个元素 unset array_name[index]
删除整个数组 unset array_name
常见符号
重定向
>符号
:表示将符号左侧的内容,以覆盖的方式输入到右侧文件中
>>符号
:表示将符号左侧的内容,以追加的方式输入到右侧文件的末尾行中
1 |
|
管道符
|
:命令1 | 命令2
,管道符左侧命令1执行后的结果,传递给管道符右侧的命令2使用
流程控制语句
if
1 |
|
case
1 |
|
for
1 |
|
while
1 |
|
条件的类型:命令、[[ 字符串表达式 ]]、(( 数字表达式 ))
until
1 |
|
条件的类型:命令、[[ 字符串表达式 ]]、(( 数字表达式 ))
循环退出
break
: 跳出所有循环break n
: 跳出第n个循环(由内向外)continue
: 跳出当前循环exit
: 退出程序
函数
定义函数
1 |
|
调用函数
1 |
|
常用命令
grep
grep [参数] [关键字] <文件名>
:文本搜索命令
参数:-c
只输出匹配行的计数,-n
显示匹配行及好号,-v
显示不包含匹配文本的所有行
find
find [路径] [参数] [关键字] [动作]
:查找命令
参数:-name
按照文件名查找文件,-user
按照文件属主查找文件,-group
按照文件所属组来查找文件,-type
查找某一类型的文件