参考:《shell脚本-菜鸟教程》
1.shell脚本简介
1.1. 什么是shell
百度百科解释如下:
1.2 . 什么是脚本
百度百科解释如下:
脚本语言又被称为扩建的语言, 或者动态语言, 是一种编程语言, 用来控制软件应用程序, 脚本通常是以文本 (ASCⅡ) 保存, 只是在被调用时进行解释或者编译
简单的来说:
就是一条条可执行的命令。这些命令保存在一个文本文件里面,称为脚本文件。
常见的脚本文件有: Javascript脚本,sql脚本,shell脚本,jsp脚本等等
1.3 什么是shell脚本
百度百科 解释如下:
简单的来说
就是把各种linux命令放入存放到一个文本文件中,然后去执行这个文本文件,就像把所有的SQL放入到一个文本中,然后去执行SQL文件是一样的道理
1.4 shell脚本好处
- 提交程序开发效率
- 批量处理,加快任务完成进度
2. shell分类
-
Bourne Shell
UNIX 最初使用的 shell,并且在每种 UNIX 上都可以使用, 在 shell 编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。
-
Bourne Again Shell(/bin/bash)
Linunx默认的shell,是Bourne shell 的扩展,简称 Bash,与 Bourne shell 完全向后兼容,并且在Bourne Shell基础上加了很多新的特性。因此也更加灵活。所以一般来说shell脚本都会执行它为执行路径。也可以认为
-
C Shell
主要是为了让用户更容易的使用交互式功能,并把ALGOL风格的语法结构变成了C语言风格。它新增了命令历史、别名、文件名替换、作业控制等功,其内部命令共有52个,现在已经被
tc shell
所取代了。 -
K Shell
Korn shell 是与 Bourne shell 向后兼容的,并且包含大部分的 Bourne shell 的特点和几个 C shell 的最好特点。许多安装脚本都是用了ksh,其内部共有42条命令。
-
TC Shell
Tcsh是csh的增强版,并且完全兼容csh。它不但具有csh的全部功能,还具有命令行编辑、拼写校正、可编程字符集、历史纪录、作业控制等功能,以及C语言风格的语法结构。
3. shell 快速入门
3.1 准备工作
-
安装Linux系统,这里我安装虚拟机。配置如下:
3.2 shell -helloword
-
在当前文件夹下新建一个
hello.sh
解释:
shell脚本文件后缀名必须为 xx.sh
-
文件内容如下
#!/bin/bash #这是一个注释 echo '这是第一个脚本'
解释:
脚本文件第一行必须为
#!/bin/bash
.其含义是告诉系统脚本文件的解释器路径是什么。shell脚本里面的注释为:
#注释
echo 输出语句,类似于java中
System.out.print
-
修改文件权限
解释:
既然hello.sh是一个脚本文件,那么就需要去执行,可是创建出来的文件没有执行权限,因此需要增加执行权限。
chmod +x hello.sh
-
执行脚本
./hello.sh
注意:
一定要写成
./hello.sh
,如果写成hello.sh
,那么就会出现下面的错误这是因为直接写
hello.sh
,linux 系统会去PATH
里寻找有没有叫hello.sh
的,而只有/bin
,/sbin
,/usr/bin
,/usr/sbin
等在 PATH 里,而当前目录通常不在PATH
里,所以写成hello.sh
是会找不到命令的,要用./hello.sh
告诉系统说,就在当前目录找。当然除此以外还有另外一种方式去运行脚本:
这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/bash hello.sh
3.3 小练习
-
在到/home目录下,创建一个aa.txt文件
vim test1.sh
文件内容如下:
#!/bin/bash #进入home目录 cd /home #创建文件 touch aa.txt echo '执行成功'
增加文件权限
chmod +x test1.sh
执行脚本
./test1.sh
注意,切换到root用户下执行,否则可能会有权限问题。
查看执行结果:
通过上述的练习我们可以知道,所谓的脚本就是将多个命令堆积到一块,然后去执行这个脚本。当然这只是shell基本写法,除了这个基本写法以外还有一些高级写法,接下来我们就来看看高级写法
3.4 变量
3.4.1 基本变量
-
定义变量
name='value' name="value"
- 变量名只能由英文字母,数字和下划线组成,不能以数字开头。
- 变量名中间不能有空格
- 不能使用标点符号
- 不能使用关键字(可以使用help指令查看关键字)
-
使用变量
your_name="hello" echo $your_name
使用变量就在变量名前面加上美元符号即可
-
案例
#!/bin/bash #字符串需要加上单引号和双引号 name="lisi" #数字可以不加不加 num=1 #boolean类型的数据也可以不加 flag=true # 使用变量 $变量名 echo $name echo $num echo $flag
执行结果如下
注意:
双引号能够识别变量,且能够使用转义
单引号不能够识别变量且不能够转移,只能原样输出。如下:
#!/bin/bash num=123 test1="hello$num" test2='hello$num' echo $test1 echo $test2
执行结果如下:
-
定义变量,输入日期格式,格式为
年:月:日 时:分:秒
#!/bin/bash dt=`date +'%F %T'` echo $dt
命令的结果赋值给一个变量,需要加上反单引号
3.4.2 只读变量
使用 readonly
命令可以将变量改为只读变量,只读变量不能够再去赋值,如下:
#!/bin/bash
name=lisi
readonly name
name=wangwu
echo $name
执行报错,从下图的错误显示看,name是一个只读变量
3.4.3 删除变量
使用unset
删除变量
#!/bin/bash
name="lisi"
age=15
unset name
echo $age
echo $name
执行可知
如图,当把name变量删除后,打印出来的就只有空行了。
3.4.4 接收用户输入
使用read -p 提示信息 变量名
去接收用户的参数
#!/bin/bash
read -p '请输入姓名' name
echo $name
3.5 字符串操作
3.5.1 拼接字符串
-
单引号
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
-
双引号
- 双引号里可以有变量
- 双引号里可以出现转义字符
-
案例
-
拼接字符串
#!/bin/bash name="lisi" #单引号拼接字符串 desc='你的名字是'$name'' #双引号拼接字符串 desc2="你的名字是$name" echo $desc $desc2
-
3.5.2 字符串长度
#!/bin/bash
name="lisi"
#单引号拼接字符串
desc='你的名字是'$name''
#双引号拼接字符串
desc2="你的名字是$name"
echo $desc $desc2
# 获取字符串长度
echo ${#desc2}
3.5.3 截取字符串
#!/bin/bash
name="lisi"
#单引号拼接字符串
desc='你的名字是'$name''
#双引号拼接字符串
desc2="你的名字是$name"
echo $desc $desc2
# 获取字符串长度
echo ${#desc2}
#从索引为2的位置开始连续截取4个字符,索引从0开始
echo ${desc:2:4}
3.6 数组
3.6.1 简介
bash 支持一维数组,不支持多维数组,与java一样,数组下标从0开始,数组大小没有限制,对数组里面的元素类型也没有限制
3.6.2 定义数组
-
语法1
array_name=(value1 value2 ...);
-
语法2
array_name=( value1 value2 value3 ... ) array_name[0]=value0 array_name[1]=value1 ...
3.6.3 获取数组值
-
语法
#获取数组特定元素 ${array_name[index]} #获取数组所有元素 ${array_name[@]}
-
案例
#!/bin/bash # 定义数组 里面的数组类型没有特定的显示 array=(1 5 6 "lisi") # 打印数组里面所有的元素 echo ${array[@]} # 打印数组下标为2的元素 echo ${array[2]} echo "------------------------------------------------" #数组第二种方式 arr=( true "lisi" 1 5 ) echo ${arr[1]} echo ${arr[@]} echo "---------------------------------------------" #数组的第三种方式 arr2[0]=1 arr2[1]=true arr2[2]="wangwu" echo ${arr2[@]}
执行脚本
3.6.4 数组长度
#!/bin/bash
array=(1 5 6 "lisi")
length=${#array[@]}
echo $length
执行结果如下:
3.7 注释
-
单行注释
#这是一个注释,到时候注释会被解释器忽略掉 # 通过每一行加一个 # 号设置多行注释,像这样 ##### tomcat start ##### # # # tomcat config # # ##### tomcat end #####
-
多行注释
:<<EOF 这是一个注释1 这是一个注释2 这是一个注释3 ... EOF
#!/bin/bash :<<EOF 注释1 注释2 EOF array=(1 5 6 "lisi") length=${#array[@]} echo $length
执行结果如下: