第四章 主要讲了简单的shell脚本编写,重点讲了 if-else 选择,for,while循环,case多分枝选择的语法。
想要编写脚本,一定会用到编辑器。所以要先了解编辑器的基本操作。
一、什么是vim?
vim是linux平台下一个很古老的文本编辑器,他成为了linux的标配,计算机的更新换代如此之快,vim编辑器作为最老一批的编辑器能沿用至今,功能之强大可见一斑!所以vim也成了必学的一个文本编辑器。vim编辑器与其他编辑器的区别最大在于它不依赖鼠标就能完成很多的操作,大大提升了编辑效率。它有三个模式也是他的一大特点:命令模式,编辑模式,末行模式。vim功能的扩展与订制也成为了他功能强大一个特点,只需要简单的知识,就能根据个人的需要,定制出完全不同的特性。
二、vim的基本操作
三种模式:命令模式、编辑模式、末行模式
只有在命令模式下才可以切换到编辑模式与末行模式
编辑模式下,命令模式中的功能键位失效,只能编辑文本
命令模式下,键位只保留各种功能键位
命令模式下:(esc键进入命令模式,为了确保进入命令模式,可以多按几下养成习惯)
k(上)
h(左) l(右)
j (下)
a: 在光标后插入,进入编辑模式
A:在行尾插入,进入编辑模式
i:在光标前插入,进入编辑模式
I:在行头插入,进入编辑模式
o:在当前行下新建一行,进入编辑模式
O:在当前行上新建一行,进入编辑模式
s:删除当前光标的字符,进入编辑模式
S:删除当前行,进入编辑模式
x:删除当前字符,不进入编辑模式,系统delete键位
dw:删除光标之后的单词。不进入编辑模式
dd:删除当前行,不进入编辑模式
yy:复制当前行,
p:配合yy使用,粘贴到光标后
P:配合yy使用,粘贴到光标之前。
末行模式:(命令模式下,敲“:”冒号,就可以进入末行模式。)
:w 保存更改
:q/q! 推出/强制退出
:wq 保存并退出
以上也就是vim常用的一些键位。需要拓展的话是一个无底洞。喜欢的可以自行查资料
二、什么是脚本?
脚本,在汉语解释中,就是故事大纲,它并没有故事细节,如:1.小明诞生 2.小明成长 3.小明死亡 这就是一个脚本
对于编程而言就是可以不经编译而直接解释执行,利于快速开发或一些轻量的控制功能的命令的集合就称之为脚本。
在linux中由bash解释器执行的命令的集合就是脚本。
三、简单的脚本
在Linux终端命令行下:
1. vim test.sh 开始编辑以下内容
#!/bin/bash //声明使用什么解释器
who
pwd
ls -la
2. bash test.sh 使用bash执行此脚本
可以看到输出结果就如同直接在终端命令行下,分别执行who、pwd、ls -la 等命令。
区别就在于在终端命令行下分别执行的命令各自独立,解释器不知道其中的联系。
使用脚本就可以用简单的命令执行和解决复杂的功能和问题。
四、接受用户的参数
只执行预定义的功能,太过于死板,不能了解与灵活的执行用户的需求,这样的脚本只能做简单的功能。
想要执行复杂的功能,一定会与用户有交互过程,与用户交互依靠参数作为媒介。
以脚本名称为第一个参数,计算机中计数从0开始。
$0 对应脚本名称
$1 $2 $3 ...........分别对应第一个参数 第二个参数 第三个参数 第N 个参数
$* 对用所有参数
$# 参数的数量
下面这个简单的脚本为了更好的理解以上变量。不要在乎循环,其中会有注释表明意思
linux 终端命令行下:
vim test.sh 编写如下脚本
#!/bin/bash //声明使用什么解释器
echo "Script name : $0" // 脚本名字为 : $0 对应脚本名称参数
echo "There are $# parameters" // 共有 $# 个参数 。 $# 对应参数个数
echo "They are :$*" // 分别是:$* 对应所有参数。
for i in $*
do
echo $i
done
linux终端命令行下:
bash test.sh a b c d 执行脚本
执行结果这里不贴了。自行理解。
五、流程控制
有一个计算机名人,叫什么名字忘了。他说:世界上所有复杂的问题都可以用顺序,选择,循环来解决。
0、学习流程控制必定要学习判断。
linux中不外乎三种判断:
1) 文件判断
-d : 判断文件是否为目录类型
-e: 判断文件是否存在
-f : 判断文件是否为一般文件
-r : 判断当前用户是否有权限读取
-w: 判断当前用户是否有权限写入
-x: 判断当前用户是否有权限执行
2)数值判断
[ ] 中括号下使用:
-eq: 是否等于
-ne: 是否不等于
-gt: 是否大于
-lt: 是否小于
-le: 是否小于等于
-ge: 是否大于等于
(( )) 双小括号下使用:
== 、!= 、< 、<= 、> 、 >=
3)字符串判断
[ ] 中括号下使用:
= 是否等于
!= 是否不等于
-z 是否为空
1、if ....else 选择结构
选择结构语法为:
单分支:
if (( 条件判断 )) ; then 或者 if [ 条件判断 ] ; then
命令 命令
fi fi
多分支:
if (( 条件判断 )) ;then 或者 if [ 条件判断 ] ; then
命令 命令
elif (( 条件判断 )) then elif [ 条件判断 ] then
命令 命令
else else
命令 命令
fi fi
下面是一个简单的脚本,意在理解上面的条件判断与选择结构的语法,不要看很长就觉得复杂,其实都是由最简单的结构堆积起来了。其中注释会标明每行的意思
#!/bin/bash //声明使用哪个解释器
path1=/root/1.txt //变量初始化 将路径赋值给path1
path2=/root/2.txt //变量初始化
if [-e $path1] ; then //判断文件是否存在
echo "$path1 is already exists!" //存在则将path1的内容打印出来,并表示存在
echo "1" > $path1 //向这个文件中覆盖写入 1
else
echo "$path1 does not exist , create file." // 不存在则将path1的内容打印出来,并表示创建
touch $path1 //创建此文件
echo "1" > $path1 //向这个文件中覆盖写入 1
fi
if [-e $path2] ; then
echo "$path2 is already exists!"
echo "1" > $path2
else
echo "$path2 does not exist , create file."
touch $path2
echo "1" > $path2
fi
var1=$(cat $path1) //读出文件1的内容,赋值给变量var1
var2=$(cat $path2) //读出文件2的内容,赋值给变量var2
if (( $var1 < $var2 )) ; then //如果var1 < var2 则输出 “hahahah”
echo "hahahahah"
fi
if (( $var1 == $var2 )) ; then // 如果var1等于var2 则输出 文件1 = 文件2
echo "$path1 = $path2"
else // 否则输出 文件1 不等于 文件2
echo "$path1 != $path2"
fi
if (( $var1 > $var2 )) : then // 如果var1 大于 var2 则输出 文件1 > 文件2
echo "$path1 > $path2"
else // 否则输出 文件1 小于 文件2
echo "$path1 < $path2"
fi
2.循环结构
for 循环结构:
for 变量名 in 取值列表 或者 for ((i = 0 ; i < 10 ; i++))
do do
循环体 循环体
done done
常用第一种,取值列表可以是文件,可以是命令返回值等范围,第二种更像C语言中的for循环语句,常用数值循环
下面是简单的for循环脚本,意在理解for循环的使用。
#!/bin/bash
for i in `ls` //ls命令返回值作为取值范围
do
echo $i //循环显示i的每一次值
done
for (( i = 0 ; i < 10 ; i++)) //C 语言基础 不解释了
do
echo $i
done
while 循环结构:
while 条件测试
do
循环体
done
这里while循环结构较为简单,并无太多变体。说到条件测试。前面各种判断语句的使用已经很详细了。
这里再做一下说明,(( )) 用来数值型判断。
#!/bin/bash
i = 0
while (( i++ < 10)) // C 语言的基础 不做解释
do
echo $i
done
下面是用脚本编写的一个猜数值的小游戏。$RANDOM 每次会产生一个随机值。
for 循环编写:
#!/bin/bash
n=$(($RANDOM % 100))
times=0
echo "Guess what i think is the number ."
for (( `read -p "please enter the value you guessed " i` ; i != n ; times++ ))
do
if (( i < n )) ; then
echo "Too small ! carry on."
else
echo "Too big ! guess agin."
fi
read -p "please enter the value you guessed " i
done
echo "Yes ! yes ! yes ! You guessed it.what i want is this number : $n"
if (( $times< 10 )) ; then
echo "Wow! you are amazing ! i guessed it after using it less than 10 times!"
elif (( $times > 10 && $times<= 20 )) ; then
echo "not bad ! you guessed $times times."
else
echo "$times times . next time you work hard."
fi
while 循环编写:
#!/bin/bash
n=$($RANDOM % 100)
times=0
echo "Guess what i think is the number"
read -p "please enter the value you guessed " i
while (( i != n ))
do
let times++
if (( i < n )) ; then
echo "Too small ! carry on."
else
echo "Too big ! guess agin."
fi
read -p "please enter the value you guessed " i
done
echo "Yes ! yes ! yes! you guessed it . what i want is this number : $n"
if (( $times < 10 )) ; then
echo "Wow ! you are amazing ! guessed it after using it less than 10 times!"
elif (( $times > 10 && $times <= 20 )) ; then
echo "not bad ! you guessed $times times."
else
echo "$times times. next time you work hard."
fi
3.case 条件测试语句
case的语法要与通配符的知识相结合使用,上一章中说过了,?、[] 、*.......
case 变量值 in
条件1)
命令
;; <-----------------------------------注意这两个分号必须再下一行,否则不是理想的执行结果
条件2)
命令
;;
*)
命令
esac
case 语句的语法比较死板,必须是以上的结构,双分号必须另起一行,否则无法得到理想的执行结果
下面是一个简单的脚本实例
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认: " key
case $key in
[a-z] | [A-Z]) //这里的|是管道符的意思,不要错理解成C中的按位或
echo "您输入的是字符"
;;
[0-9])
echo "您输入的是数字"
;;
*)
echo "您输入的是特殊字符"
esac
六、计划任务服务程序
在学习了编写简单的脚本后,就可以通过一行执行脚本的命令来做复杂的任务了。但是还是不够完全的自动化,还是脱离不了人为的去输入执行脚本的命令。这是就用到了计划任务服务。它能够根据要求,按时的完成一些任务。
linux中有两种计划任务服务程序,分别是一次性计划,和长期计划
单次计划: at 计划时间
命令行中输入 at 计划时间 就进入了交互界面,写下自己在计划的时间需要执行的命令,然后按ctrl+d 结束编写
at -l 查看当前计划列表
长期计划 需要安装crond服务
crontab -e 来编辑计划任务 它调用的vim编辑器
计划格式,要记住顺口溜,分时日月星期命令。没有的话用*来占位,命令要写绝对路径