目录
一、 前言
经过前面三节基础的学习,我们终于要迈入shell
的大门了。作为一个后端开发,不一定要精通shell
脚本开发,但是需要掌握一定的shell
编程技巧,毕竟shell脚本
作为一门轻量级脚本语言,很多时候可以帮助我们完成一些重复的劳动,极大的释放劳动力。
二、认识shell
脚本
shell
脚本包含的内容
一个完整的shell
脚本主要包含以下几部分内容
- 运行环境(指定解析器),即
shell
脚本的第一行通常是#!/bin/bash
。 - 该脚本的注释说明,注释可能有多行除第一行以外其它以
#
开头的为注释,一个好的shell
脚本是便于人阅读的,因此注释是必不可少的部分,特别是复杂的脚本。 - 脚本的具体命令。
执行shell
脚本的方式
执行shell
脚本的方式有两种:
- 使用
bash
解释器,语法bash 目标shell脚本文件
,其特点是,不需要第一行指定解析器,不需要给脚本设置执行权限。 - 脚本路径前加一个
.
,例如脚本文件在当前目录则可以使用./脚本文件名
来执行脚本,其特点是需要第一行指定解析器(大多数情况不写也不会出错,因为系统会有默认解释器,但是做为一个良好的编程习惯,建议首行执行解释器),需要给脚本设置执行权限。工作中通常使用第二种方式。
第一个shell
脚本
牛刀小试,说了这么多,我们来写一个shell
脚本。
需求:记录当前时间以及当前目录下所有文件及其子目录文件的详细信息到/usr/local/shell/fileLog.txt
。
fileDetails.sh
#!/bin/bash
# 记录当前时间以及当前目录下所有文件及其子目录文件的详细信息追加到`/usr/local/shell/fileLog.txt`
date >> /usr/local/shell/fileLog.txt
# -h 以方便人类阅读的方式展示 -R 递归展示
ls -lhR ./ >> /usr/local/shell/fileLog.txt
一个简单的shell
脚本就完成了,主体命令只有两条。
执行脚本,我们可以使用bash fileDetails.sh
,但是我们一般习惯使用第二种方式,这时需要授权对这个脚本文件的执行的权限。
可以ls
先查看下,没有执行权限的fileDetails.sh
是白色的,这时我们授权执行的权限,执行chmod u+x fileDetails.sh
。再次ls
查看,发现fileDetails.sh
已经显示为绿色,表明现在有了对该文件的执行权限。
这时,即可使用./fileDetails.sh
来执行脚本了。
执行完毕以后,通过cat fileLog.txt
我们发现里面记录了两次执行后的结果,至此,一个简单的脚本就完成啦!
三、shell
脚本变量的种类
shell
脚本的变量主要分为 3 类,即用户自定义变量、系统预定义变量、位置变量(也可以称作是系统预定义变量的一部分)。
用户自定义变量
即用户自己定义的变量
定义变量
基本语法:变量名=变量值
变量名以英文字母下划线开头,区分大小写。
例如
name=zhangsan
Score=100
age=18
使用变量
语法$变量名
echo $name
echo $Score
echo $age
如果变量名后面紧跟字符,需要使用${变量名}
的方式来访问变量。
#!/bin/bash
# 变量的定义和使用
name=张三
age=19
echo "I am $name,I'm $age years old。"
# 不能正确读取变量age
echo "I am $namefeng"
# 可以正确读取变量age
echo "I am ${name}feng"
读取键盘输入端值并赋值给变量
#!/bin/bash
# 读取键盘的输入
read -p "please input your name:" name
echo "Hello everyone, i'm ${name}"
"
、'
、反引号
的区别
"
如果一句话中有变量,则需要使用双引号。
'
但英豪不会替换变量的值
反引号
位于键盘左上角esc
键下方那个键,其作用是用来解析命令,并且把结果返回。
#!/bin/bash
# 读取键盘的输入
read -p "please input your name:" name
echo "Hello every, i'm ${name}"
echo "Hello every, i'm ${name}"
num=`ls | wc -l`
echo "here has ${num} files!"
删除变量
语法 unset 变量名
unset name
unset age
系统预定义变量
linux
系统预定义变量常用的包含以下4个,即$?、$*、$#、$0
。
$#
获取命令行中参数个数。
$0
返回当前进程/程序的名称。
$*
返回命令行中的各个参数。
$0
返回上一条命令的执行状态,为0
时表示正常,非0
时表示执行异常或出错
看个例子
var.sh
#!/bin/bash
# 系统预定义变量
echo "读取到命令行参数的个数是:$#"
echo "读取到的参数分别是:$*"
total=0
for i in $*;do
total=$(($total+$i))
done
echo "读取到的参数之和是 $total"
ls -l | grep -P '^\d{4}-\d{2}-\d{2}$'
if [[ $?==0 ]];then
echo "上条命令执行成功,程序继续执行"
else
echo "上条命令执行失败,程序终止。"
fi
执行 ./var.sh 1 2 3 4
,观察结果,相信通过上面这个例子大家对于系统预定义变量已经了解了。
位置变量
相对来说,位置变量就比较简单了,通过 $1 - $9 来获取命令行第 1 到第 9 个变量。直接看例子
var.sh
#!/bin/bash
# 位置变量
echo "读取到的第一个变量是:$1"
echo "读取到的第二个变量是:$2"
echo "读取到的第三个变量是:$3"
sum=`expr $1 + $2 + $3`
echo "读取到的三个变量的和是:$sum"
echo "读取到的三个变量的和是:$(($1 + $2 +$3))"
执行命令./var.sh 1 2 3
,结果如下
读取到的第一个变量是:1
读取到的第二个变量是:2
读取到的第三个变量是:3
读取到的三个变量的和是:6
读取到的三个变量的和是:6
今天关于shell
脚本的基础就介绍到这里,快去练练手吧,各位,改日再战!!
系列传送门如下:
Shell脚本基础从头开始(一)── 几个linux实操技巧
Shell脚本基础从头开始(二)── 输出重定向
Shell脚本基础从头开始(三)── linux的权限管理
Shell脚本基础从头开始(五)── shell的输入输出
Shell脚本基础从头开始(六) ── shell条件测试
Shell脚本基础从头开始(七)── shell的流程控制
Shell脚本基础从头开始(八)── shell的循环语句
Shell脚本基础从头开始(九)── shell的循环语句控制
Shell脚本基础从头开始(十)── shell的文本过滤
Shell脚本基础从头开始(十一)── shell的文本过滤(二)
Shell脚本基础从头开始(十二)── 制作一个字符菜单
Shell脚本基础从头开始(完结篇)── 利用shell编写监控脚本以及shell操作数据库