Shell脚本编程
目录
1 基本介绍
1.1 什么是Shell
- 是一个用C语言编写的程序,它是用户使用Linux的桥梁
- 是一种命令语言,又是一种程序设计语言
- 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务
1.2 什么是Shell Script
- 是一种为Shell编写的脚本程序
1.3 Shell能做什么
- 将多个命令写在一起,让用户很轻松的就能执行一个文件的Shell脚本,就能够一次执行多个命令。
2 运行环境
2.1 Shell 环境
- Bourne Again Shell (/bin/bash)
- Bourne Shell (/usr/bin/sh或/bin/sh)
- 只要有一个能编写代码的文本编辑器vi和一个能解释执行的脚本解释器就可以了
2.2 bash环境文件
.bash_profile
- 设置环境变量
- 账户一建立,该文件就存在
.bashrc
- 存放针对bash的命令
- 在
.bash_profile
之后执行
.bash_logout
- 仅在退出注册时执行
.bash_history
- 历史记录
3 运行基础
3.1 Shell脚本格式
- 格式:vi 脚本名字.sh
- 脚本的后缀名可以任意修改,任然可以正常运行
- 脚本第一行格式:
#!/bin/bash
- 符号
#!
用来指定该脚本文件的解析程序
- 符号
3.2 脚本的执行
- 方式一
- 先赋予一个执行的权限:
chmod +x 脚本文件名字
- 编译:
./脚本文件的名字
- 先赋予一个执行的权限:
- 方式二
/bin/bash 脚本文件的名字
4 编程语法
4.1 变量
- 变量的声明格式
- 变量名字=变量值
- 等号两端不能有空格
- 变量名的命名规则
- 首字母为字母
- 中间不能有空格,可以使用下划线和数字
- 不能使用标点符号
- 不能使用bash关键字
- 使用一个定义过的变量
- 在变量名前面加
$
符号即可 - 变量名外面的花括号时可选的,起帮助解释器识别变量边界的作用
- 在变量名前面加
- 只读变量
readonly 变量名
- 删除变量
unset 变量名
4.2 字符串
- 拼接字符串
- 获取z字符串长度
${#变量的名字}
- 提取子字符串
${变量的名字:开始字符下标:截取的长度}
- 字符串第一个位置下标为0
4.3 数组
- 数组格式
- 相当于多个相同类型的变量组成的集合
数组名=(值1 值2 ... 值n)
- 数字元素用空格隔开
- 读取数组
${数组名[下标]}
- 使用
@
获取数组中的所有元素
- 获取数组长度
- 获取数组元素个数:
${#数组名[@]}
- 获取数组单个元素长度:
${#数组名[下标]}
- 获取数组元素个数:
4.4 注释
- 以
"#"
开头的行就是注释,会被解释器忽略
4.5 基本运算符
-
算数运算符
expr
是一款表达式计算工具,使用它能完成表达式的求值操作- 两个数相加(使用的是反引号:``)
- 运算符与运算值之间必须有空格(运算符两边必须有空格)
- 使用乘号是前面加上反斜杠:
\*
-
关系运算符
-eq
:检测两个数是否相等,相等返回true
-ne
:检测两个数是否相等,不相等返回true
-gt
:检测左边的数是否大于右边-lt
:检测左边的数是否小于右边-ge
:检测左边的数是否大于等于右边-le
:检测左边的数是否小于等于右边
-
布尔运算符
!
:非运算-o
:或运算,有一个表达式值为true
,则结果为true
- -a:与运算,只有两个表达式值为
true
,结果才为true
- 优先级:
!>-a>-o
-
逻辑运算符
&&
:逻辑的AND
||
:逻辑的OR
-
字符串运算符
=
:检测两个字符串是否相等,相等为true
$a = $b
!=
:检测两个字符串长度是否相等,不等为true
-z
:检测字符串长度是否为0,为0 返回true
-z $a
-n
:检测字符串长度是否为0,不为0 返回true
str
:检测字符串是否为空,不为空返回true
-
文件测试运算符
-d file
:检测文件是否是目录-f file
:检测文件是否是普通文件-r file
:检测文件是否可读-w file
:检测文件是否可写-x file
:检测文件是否可执行-s file
:检测文件是否为空(文件大小是否为0)-e file
:检测文件(包括目录)是否存在- file前面加
$
符号
-
echo
命令- 格式:
echo "字符内容"
- 转义字符:
\
进行转义的操作\b
:后退\n
:换行\t
:水平指标符号\\
:反斜杠字符 \\c
:不换行- 开启转义:
e(除转义特殊字符外)
read 变量名
- 从终端输入值,将其分配给该变量
echo "It is pushed to the file." > myfile
>
:把操作结果保存在指定文件中(覆盖操作)>>
:追加操作
- 格式:
-
printf
命令printf 格式声明 与格式声明相对应的参数列表
%d
整数%s
字符串%c
相应参数的第一个字符%f
浮点数
-
test
命令- 检查某个条件是否成立
if test $a -gt 10
-
数值运算
-
$(())
-
expr ``
-
-
条件判断
-
if语句
-
格式一:
if [ 判断条件 ](“判断条件"l两边有空格) then 语句块 fi
-
格式二
if [ 判断条件 ] then 语句块1 else 语句块2 fi
-
格式三
if [ 判断条件1 ] then 语句块1 elif [ 判断条件2 ] then 语句块2 else 语句块3 fi
-
case语句
case $变量名 in “第一个变量内容”) 程序段 ;; “第二个变量内容”) 程序段 ;; *) 不包含第一个变量内容和第二个变量内容的其他程序段 ;; esac
-
-
-
循环
-
while...do..done
while ((判断条件)) do 程序段 done
-
break和continue
break:跳出所有循环 continue:让程序跳转到循环开始的地方(判断条件)
-
for...do..done
- 格式一
for ((初始值;条件;运算语句)) do 程序段 done
- 格式二
for 变量名 in 值1 值2 ... do 程序段 done
-
-
函数
-
格式一
function 函数名(){ 函数体 }
-
格式二
函数名(){ 函数体 }
-
变量
- 全局变量:在脚本中,函数外
- 局部变量:在脚本中,函数内
-
返回值
- 在函数体的最后加:
return 返回值(整数)
- 返回值的结果只能通过
$?
来进行获取
- 在函数体的最后加:
-
参数传递
- 通过
$n
的形式来获取传递过来的参数值(n表示第几个传过来的参数) - 当n大于等于10时,格式为
${n}
$#
:参数总数$*
:作为一个字符串输出所有参数
- 通过
-
递归函数
- 自己调用自己的函数
-